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

  • 首先在Adapter中新建一个接口
public static interface OnItemClickListener {
	void onItemClicked(View v, int postion);
}
  • 创建一个对应的实例,并且提供set/get方法
private OnItemClickListener onItemClickListener;
public OnItemClickListener getOnItemClickListener() {
	return onItemClickListener;
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
	this.onItemClickListener = onItemClickListener;
}
  • 在onCreateViewHolder的时候,给获取的view设置点击事件
view.setOnClickListener(this);
  • 在onBindViewHolder时,将位置信息传递给view的holder中view的tag里
holder.itemview.setTag(position);
  • 实现onClick事件的时候,调用自己定义的接口,将位置信息传递给调用者
@Override
public void onClick(View view) {
	if (onItemClickListener != null) {
		onItemClickListener.onItemClicked(view, (Integer) view.getTag());
}
}

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

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