最近做了一個這個RecyclerView的item設置點擊事件,記錄一下:
一、首先呢,是因為RecyclerView沒有像ListView那樣直接已經提供了OnItemClick或者OnItemLongClick等事件回調接口,所以需要自己來寫一個;
我是隨便在activity或者fragment中看得順眼的地方聲明了一個接口,
//也可以不在這個activity或者是fragment中來聲明接口,可以在項目中單獨創建一個interface,就改成
public static interface OnItemClickListener 就OK
,如下:
/** * 定義RecyclerView選項單擊事件的回調接口 */ public interface OnItemClickListener{//也可以不在這個activity或者是fragment中來聲明接口,可以在項目中單獨創建一個interface,就改成static就OK //參數(父組件,當前單擊的View,單擊的View的位置,數據) void onItemClick(RecyclerView parent,View view, int position, Map data); // void onItemLongClick(View view);類似,我這里沒用就不寫了 // //這個data是List中放的數據類型,因為我這里是private List<Map> mapList;這樣一個 //然后我的每個item是這樣的: // HashMap map =new HashMap(); // map.put("img",R.drawable.delete); // map.put("text","x1"); //所以我的是map類型的,那如果是item中只有text的話比如List<String>,那么data就改成String類型 }
二、有了這個接口呢,我們要去實現這個接口,那么先聲明一下,就在你的adapter里聲明,下面這樣:
private OnItemClickListener onItemClickListener;//聲明一下這個接口 //提供setter方法 public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; }
貼一下坐標:
三、這里為你自定義的adapter實現一下View.OnClickListener接口,首先在OnCreateViewHolder中設置一個監聽器,然后就是重寫onClick方法
view.setOnClickListener(this);//設置監聽器
@Override public void onClick(View v) { //根據RecyclerView獲得當前View的位置 int position = rv.getChildAdapterPosition(v); //程序執行到此,會去執行具體實現的onItemClick()方法 if (onItemClickListener!=null){ onItemClickListener.onItemClick(rv,v,position,mapList.get(position)); } }
這個也貼一下坐標吧:
四、快結束了!在Activity或者Fragment中通過Adapter設置每個Item的單擊事件:
myAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position, Map data) { Toast.makeText(getContext(),"你碰到我!"+position, Toast.LENGTH_SHORT).show();//好像是可以了,我好煩啊 } });
這樣就可以啦,運行看看吧~~