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。
這個博客很基礎,就不粘貼全部的代碼了。不懂的可以留言給我。
不是悶騷的程序員算不上程序員。我的微信公眾號“那點鼻事”,在這里周一到周五每天一篇文章,與技術無關,只哈牛逼。