1. 程式人生 > >為RecyclerView自行新增item的點選事件

為RecyclerView自行新增item的點選事件

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。