public static interface OnItemClickListener {
void onItemClick(View view,ViewName VIEW,int position);
void onItemLongClick(int position);
}
private OnItemClickListener mOnItemClickListener = null;
- 在adapter中设置以下函数,供在activity或fragment中调用
public void setmOnItemClickListener(RecyclerViewMessageAdapter.OnItemClickListener onItemClickListener){
this.mOnItemClickListener = onItemClickListener;
}
itemView.setOnClickListener(RecyclerViewMessageAdapter.this);
circleImageView.setOnClickListener(RecyclerViewMessageAdapter.this);
- 重写onClick函数,根据id来区别每一个view,通过getTag()来获取view的位置,记住在bind的时候要setTag(position)。ViewName变量类型是自己定义的枚举类型。
//用一个枚举类型来表示不同的view
public enum ViewName{
ITEM,
HEADER
}
@Override
public void onClick(View v){
int position = (int)v.getTag();
switch (v.getId()){
case R.id.civ_header:
//这是头像的点击事件
mOnItemClickListener.onItemClick(v,ViewName.HEADER,position);
break;
default:
//默认是整个item的点击事件
mOnItemClickListener.onItemClick(v,ViewName.ITEM,position);
break;
}
}
- 在activity中实现接口该接口,重写onItemClick()方法,同样是根据id来区别不同的view。
@Override
public void onItemClick(View view, RecyclerViewMessageAdapter.ViewName viewName,int position) {
switch (view.getId()){
case R.id.civ_header:
Toast.makeText(getContext(),"点击了头像:" + position,Toast.LENGTH_SHORT).show();
Log.d(TAG, "onItemClick: 点击了头像:" + position);
break;
default:
Toast.makeText(getContext(),"点击了item:" + position,Toast.LENGTH_SHORT).show();
Log.d(TAG, "onItemClick: 点击了item:" + position);
break;
}
}
一个小坑
- 今天我在设置item点击事件的时候,发现实现之后无效,最后发现是我的item布局外面多套了一个framelayout,我的item布局是cardview写的,当外面套了个framelayout的时候,item的点击事件就失效了,删除之后点击事件就能用了。