RecyclerView实现Item点击事件

概述

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) {
    
    

        }
    });

猜你喜欢

转载自blog.csdn.net/ymtianyu/article/details/109352193