实现recyclerView的子项点击事件
第一种方法:我们可以这么做。在Adapter中,因为
内部类ViewHolder是调用父类中的构造函数super(itemView),这个itemView就是当前子项布局,可以直接在其中以itemView.setOnclickListener设置点击事件;
当然也可以在其中先找到子项布局中的各个控件,分别设置点击事件。如:
public class StandTypeHolder extends RecyclerView.ViewHolder{
private ImageView mPic;
private TextView mTitle;
public StandTypeHolder(@NonNull final View itemView) {
super(itemView);
mPic = itemView.findViewById(R.id.icon);
mTitle = itemView.findViewById(R.id.title);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(itemView.getContext(),"点击了布局",Toast.LENGTH_SHORT).show();
}
});
mPic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(itemView.getContext(),"点击了图片",Toast.LENGTH_SHORT).show();
}
});
mTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(itemView.getContext(),"点击了标题",Toast.LENGTH_SHORT).show();
}
});
}
第二种:
在Adapter中设置接口,暴露给外部调用,由外部实现具体点击事件
//设置接口的方法
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
/**
* 编写回调的步骤
* 1.创建这个接口
* 2.定义接口内部方法
* 3.提供设置接口方法给外部
* 4.接口的调用
*/
public interface OnItemClickListener{
void onItemClick(int position);
}
/**
*在ViewHolder中当子项布局被点击,由外部执行具体的点击事件
*即实现接口中的方法
*/
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView mIcon;
private TextView mTitle;
private int mPosition;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mIcon = itemView.findViewById(R.id.icon);
mTitle = itemView.findViewById(R.id.title);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mOnItemClickListener!=null){
//当传入的mOnItemClickListener不为空就执行其中的方法
mOnItemClickListener.onItemClick(mPosition);
}
}
});
}
}
```
外部调用
mAdapter.setOnItemClickListener(new RecyclerViewBaseAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this, “你点击了第” + position + “张图片”, Toast.LENGTH_SHORT).show();
}
});