RecyclerView 点击事件处理

RecyclerView不像ListView那样,提供了setOnItemClickListener,所以一般情况需要我们自己定义一个接口实现这个功能。我一般会通过Adapter去暴露出来一个接口,便于上层获取位置和点击事件。

  • 首先在Adapter中新建一个接口

    1
    2
    3
    public static interface OnItemClickListener {
    void onItemClicked(View v, int postion);
    }
  • 创建一个对应的实例,并且提供set/get方法

    1
    2
    3
    4
    5
    6
    7
    8
    private OnItemClickListener onItemClickListener;
    public OnItemClickListener getOnItemClickListener() {
    return onItemClickListener;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
    }
  • 在onCreateViewHolder的时候,给获取的view设置点击事件

    1
    view.setOnClickListener(this);
  • 在onBindViewHolder时,将位置信息传递给view的holder中view的tag里

    1
    holder.itemview.setTag(position);
  • 实现onClick事件的时候,调用自己定义的接口,将位置信息传递给调用者

    1
    2
    3
    4
    5
    6
    @Override
    public void onClick(View view) {
    if (onItemClickListener != null) {
    onItemClickListener.onItemClicked(view, (Integer) view.getTag());
    }
    }

这样上层就很方便的获取了位置信息,并可以做相对的处理。

1
2
3
4
5
RecyclerView recyclerView = new RecyclerView(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
MyAdapter adapter = new MyAdapter();
adapter.setOnItemClickListener(l -> { /*do something you need*/ });
recyclerView.setAdapter(adapter);

Done

-------------The End-------------
请我喝一杯啤酒~