為RecyclerView自行新增item的點選事件
阿新 • • 發佈:2019-02-11
RecyclerView側重的是佈局的靈活性,雖說可以替代ListView但是連基本的點選事件都沒有,這篇文章就來詳細講解一下如何為RecyclerView的item新增點選事件,順帶也複習一下觀察者模式。
最終目的:
模擬ListView的setOnItemClickListener()方法,呼叫者只須呼叫類似於setOnItemClickListener的東西就能獲得被點選item的相關資料。
原理:
為RecyclerView的每個子item設定setOnClickListener,然後在onClick中再呼叫一次對外封裝的介面,將這個事件傳遞給外面的呼叫者。而“為RecyclerView的每個子item設定setOnClickListener”在Adapter中設定。其實直接在onClick中也能完全處理item的點選事件,但是這樣會破壞程式碼的整體邏輯性。
步驟:
自定義一個繼承自RecyclerView.Adapter的MyAdapter。
1.在MyAdapter中定義如下介面,模擬ListView的OnItemClickListener:
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
然後在在當前Adapter中宣告一個這個介面的變數
private OnItemClickListener mOnItemClickListener;
在onCreateViewHolder()中為每個item新增點選事件
將點選事件轉移給外面的呼叫者@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.item_layout, parent, false); MyViewHolder myViewHolder = new MyViewHolder(view); view.setOnClickListener(this);//將建立的Vie註冊點選事件 return myViewHolder; }
@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view, (int) view.getTag());//注意這裡使用getTag方法獲取position
}
}
注意上面呼叫介面的onItemClick()中的view.getTag()方法,這需要在onBindViewHolder()方法中設定item的position@Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.itemView.setTag(position);//將position儲存在itemView的tag中,一邊點選時獲取 }
最後暴露給外面的呼叫者,定義一個設定Listener的方法():
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
以上所有步驟都發生在自定義的adapter中,典型的觀察者模式,有點繞的地方在於,這裡涉及到兩個觀察者模式的使用,view的setOnClickListener本來就是觀察者模式,我們將這個觀察者模式的事件監聽傳遞給了我們自己的觀察者模式。
在Activity中使用:
mRecyclerAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
ToastUtils.success(TestActivity.this,"點選" + position);
}
});
好了,到這裡為RecyclerView新增item的點選事件就介紹完畢了,是不是很easy!^_^
總結:
在ListView中我們是呼叫ListView的setOnItemClickListener:
而在我們這裡是呼叫我們自己定義的mAdapter的setOnItemClickListener。