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。

這個博客很基礎,就不粘貼全部的代碼了。不懂的可以留言給我。


 

 

 

不是悶騷的程序員算不上程序員。我的微信公眾號“那點鼻事”,在這里周一到周五每天一篇文章,與技術無關,只哈牛逼。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM