首页 > 解决方案 > 最后位置不调用 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 处被调用。

提前感谢任何在这里停下来帮助我找到解决方案的人,如果您需要更多信息,请询问!

标签: androidandroid-recyclerviewbindingandroid-adapterandroid-viewholder

解决方案


使用 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);
    }

推荐阅读