android - 最后位置不调用 RecyclerView.Adapter 的 onBindViewHolder()
问题描述
正如标题所说,到达我的 RecycleView 的底部并不需要onBindViewHolder()
最后一个项目的位置。结果是到达最后一个元素后,如果我触摸 RecyclerView 列表,它会跳转到倒数第二个项目。
一开始问题更大,因为位置停止在最后一个之前被调用几个项目,比如 6 或 7,但是在更改我的ViewPager2
小部件后它变得更好
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
对此
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
但我仍然不明白为什么。
这是我的适配器的代码:
public class UserListRecyclerViewAdapter extends RecyclerView.Adapter<UserListRecyclerViewAdapter.ViewHolder> {
private final String TAG = getClass().getSimpleName();
private final List<CallManagementHelper.RemoteUserInfo> mAllUsers;
private final List<CallManagementHelper.RemoteUserInfo> mOnlineUsers;
private final List<CallManagementHelper.RemoteUserInfo> mInProgressUsers;
private final List<CallManagementHelper.RemoteUserInfo> mOfflineUsers;
private final OnListFragmentInteractionListener mListener;
public UserListRecyclerViewAdapter(List<CallManagementHelper.RemoteUserInfo> onlineUsers,
List<CallManagementHelper.RemoteUserInfo> inProgressUsers,
List<CallManagementHelper.RemoteUserInfo> offlineUsers,
OnListFragmentInteractionListener listener) {
mOnlineUsers = onlineUsers;
mInProgressUsers = inProgressUsers;
mOfflineUsers = offlineUsers;
mAllUsers = new ArrayList<>();
if (mOnlineUsers != null && mOnlineUsers.size() > 0) {
mAllUsers.addAll(mOnlineUsers);
}
if (mInProgressUsers != null && mInProgressUsers.size() > 0) {
mAllUsers.addAll(mInProgressUsers);
}
if (mOfflineUsers != null && mOfflineUsers.size() > 0) {
mAllUsers.addAll(mOfflineUsers);
}
mListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// No need for a LayoutInflater instance since the custom view inflates itself.
UserCellLayout userCell = new UserCellLayout(parent.getContext());
return new ViewHolder(userCell);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
Log.d(TAG, "onBindViewHolder: position = " + position);
CallManagementHelper.RemoteUserInfo userInfo = mAllUsers.get(position);
holder.getUserCellLayout().setFullName(userInfo.displayName);
holder.getUserCellLayout().setRemoteUserIcon(userInfo.deviceType);
holder.mView.setOnClickListener(v -> {
if (null != mListener) {
mListener.onListFragmentInteraction(userInfo);
}
});
}
@Override
public int getItemCount() {
return mAllUsers.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
final UserCellLayout mView;
ViewHolder(View view) {
super(view);
mView = (UserCellLayout) view;
}
UserCellLayout getUserCellLayout() {
return mView;
}
}
}
我已经检查过了,我mAllUsers.size()
有所有的 N 个元素,但是onBindViewHolder()
总是停止在项目 N-1 处被调用。
提前感谢任何在这里停下来帮助我找到解决方案的人,如果您需要更多信息,请询问!
解决方案
使用 mContext 而不是 parent.getContext()
private Context mContext;
UserListRecyclerViewAdapter(Context context, List<CallManagementHelper.RemoteUserInfo> onlineUsers,
List<CallManagementHelper.RemoteUserInfo> inProgressUsers,
List<CallManagementHelper.RemoteUserInfo> offlineUsers,
OnListFragmentInteractionListener listener) {
//Your code here
//Add this line
this.mContext = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// No need for a LayoutInflater instance since the custom view inflates itself.
UserCellLayout userCell = new UserCellLayout(mContext);
return new ViewHolder(userCell);
}