概述
RecyclerView本身没有实现点击事件,需要自定义接口进行实现
onRecyclerViewItemClickListener
此处我在pub中实现这个共用接口,当然你写可以在当前package下随便什么类中进行实现或者单独一个文件
public interface onRecyclerViewItemClickListener{
void onItemClick(RecyclerView parent, View view, int position);
void onItemLongClick(RecyclerView parent, View view, int position);
}
Adapter
接下来就要改造这个Adapter了
初始化接口
//初使化自定义的接口
private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
//为了方便接口函数传值,这里把RecyclerView控件拉出来
private RecyclerView rvParent;
实例化接口
//定义一个公用方法来实例化自定义接口
public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
设置监听
在你的类名之后 implements 一个 View.OnClickListener
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener {
此时会报错提示要重载 onClick事件
//重载点击事件,指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
//此时就用到上面拉出来的那个 rvParent 了
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null)
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
绑定监听事件
只是设定监听事件了,但没有指定监听事件给谁,那点击之后是不会有反应的,还需要在 onCreateViewHolder 中绑定监听事件
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件,把 RecyclerView 拉出来供 onClick 事件使用
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false);
//绑定监听点击事件,因为类本身 implement 了 View.OnClickListener 此时只要监听绑定到 this 就可以了
view.setOnClickListener(this);
return new myViewHolder(view, mContext);
}
完整代码
下面给出了完整的代码,中间无关的信息省略了
public class FileAdapter extends RecyclerView.Adapter<FileAdapter.myViewHolder> implements View.OnClickListener {
...
private pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener;
private RecyclerView rvParent;
...
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//指定一个父控件
rvParent = (RecyclerView) parent;
View view = LayoutInflater.from(mContext).inflate(R.layout.file_manager_item, parent, false);
//绑定监听点击事件
view.setOnClickListener(this);
return new myViewHolder(view, mContext);
}
...
//重载点击事件,指定点击事件时执行自定义的onItemClick
@Override
public void onClick(View view) {
int position = rvParent.getChildAdapterPosition(view);
if (onRecyclerViewItemClickListener != null)
onRecyclerViewItemClickListener.onItemClick(rvParent, view, position);
}
...
//实例化自定义接口
public void setOnItemClickListener(pub.onRecyclerViewItemClickListener onRecyclerViewItemClickListener) {
this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
}
}
Activity
接下来和正常ListView绑定监听事件的操作差不多
fileAdapter.setOnItemClickListener(new pub.onRecyclerViewItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position) {
mView.tvFmPath.setText(lstFiles.get(position).getFilePath());
getPath(lstFiles.get(position).getFilePath());
fileAdapter.notifyDataSetChanged();
}
@Override
public void onItemLongClick(RecyclerView parent, View view, int position) {
}
});