📜  不要把位置当作固定的;仅立即使用并调用 `holder.getAdapterPosition()` 稍后查找 - Java (1)

📅  最后修改于: 2023-12-03 15:21:32.080000             🧑  作者: Mango

不要把位置当作固定的

在 Android 开发中,经常会用到 RecyclerView 控件来展示列表、网格等内容。在 RecyclerView 中,我们获取某个 item 的位置通常会使用 holder.getAdapterPosition() 方法来获取,但是需要注意不要把位置当作固定的,因为这可能会导致以下问题:

  • 当用户进行了某些操作(比如删除、插入或移动某些 item),则列表中的位置会发生变化,此时之前获取的位置信息已经不再是当前的真实位置。
  • 如果将获取到的位置信息保存并在稍后使用时再进行调用,也可能会由于列表位置的变化导致错误的结果。

一个比较好的做法是,仅在需要获取位置时立即使用 holder.getAdapterPosition() 方法,并在稍后需要查询位置时再重新调用该方法获取当前的真实位置。

以下代码片段展示了一个简单的示例,演示如何使用 holder.getAdapterPosition() 方法来获取 item 的位置:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private List<String> mData;

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView mTextView;

        public MyViewHolder(View itemView) {
            super(itemView);
            mTextView = itemView.findViewById(R.id.tv_item);
        }
    }

    public MyAdapter(List<String> data) {
        mData = data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.mTextView.setText(mData.get(position));
        // 获取当前 item 的位置
        int adapterPosition = holder.getAdapterPosition();
        // 在需要使用该位置时再进行调用
        Log.d("MyAdapter", "当前位置:" + adapterPosition);
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }
}