recyclerview item点击事件

recyclerview早就不陌生了,比起过去传统的listView,样式更多,也较为高效一点,这里整理一下recylerview中item的点击事件。

 

recyclerview和listView不同的地方,在于RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,那么要想实现点击或是长按事件,就需要开发者自己来实现。

 

这里实现的方式也是网上大部分的实现方式,很方便:在ViewHolder中实现点击监听,而具体的点击处理事件有Adapter在绑定viewholder时传入,同时,在Adapter中暴露方法,可以在使用Adapter的地方,传入实例化的点击事件。这样,就需要新建一个借口,所有自定义的点击事件都继承该借口。具体流程如下:

 

(不擅于画图,凑合看吧)

 

那么具体的实现如下:

 

1、定义接口:

public interface MyItemOnClickListener {
    public void onItemOnClick(View view,int postion);
}

在接口中,定义接口方法onItemOnClick方法,在里面实现具体的点击响应事件,同时传入两个参数:view和postion。和ListView中item的点击一样。

 

2、在ViewHolder中实现单击监听:

 class FMListHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView textView;

        MyItemOnClickListener mListener;
        public FMListHolder(View itemView,MyItemOnClickListener myItemOnClickListener) {
            super(itemView);
            textView= (TextView) itemView.findViewById(R.id.id_item_text);
            this.mListener=myItemOnClickListener;

            itemView.setOnClickListener(this);
        }


        @Override
        public void onClick(View view) {
            if(mListener!=null){
                mListener.onItemOnClick(view,getPosition());
            }
        }
    }

上面的代码就是ViewHolder,在itemView或是里面包含的子View实现setOnClickListener,在OnClick中接受接口实例化传入的具体处理事件,即mListener。在这里也能看的出来,只有viewholder中可以实现点击监听。

 

3、在Adapter中绑定ViewHolder时传入接口实例化后的类

@Override
    public FMListAdapter.FMListHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        FMListHolder fmListHolder=
                new FMListHolder(LayoutInflater.from(mContext).inflate(R.layout.item_fm_list,parent,false)
                ,mMyItemOnClickListener);
        return fmListHolder;
    }

看的出,在新建ViewHoler的过程中,传入了参数 mMyItemOnClickListener,该参数肯定在实现Adapter的地方传入Adapter中,所以要在Adapter中对外暴露方法:

public void setItemOnClickListener(MyItemOnClickListener listener){
        mMyItemOnClickListener=listener;
    }

4、在实现Adapter的地方实现具体点击事件

mAdapter.setItemOnClickListener(new MyItemOnClickListener() {
            @Override
            public void onItemOnClick(View view, int postion) {
                Log.e(TAG,postion+"");
            }
        });

其实就是在使用RecyerView的地方,调用Adapter暴露的方法,将MyItemOnClickListener实例化话,并在方法onItemOnClick中实现事件,这里只是打印Log。

这个博客很基础,就不粘贴全部的代码了。不懂的可以留言给我。


 

 

 

不是闷骚的程序员算不上程序员。我的微信公众号“那点鼻事”,在这里周一到周五每天一篇文章,与技术无关,只哈牛逼。

 

 

posted @ 2017-02-17 16:11  建勋  阅读(6297)  评论(0编辑  收藏  举报