1. 程式人生 > >RecyclerView為每個item新增點選事件

RecyclerView為每個item新增點選事件



最終目的

模擬ListView的setOnItemClickListener()方法,呼叫者只須呼叫類似於setOnItemClickListener的東西就能獲得被點選item的相關資料。

原理

為RecyclerView的每個子item設定setOnClickListener,然後在onClick中再呼叫一次對外封裝的介面,將這個事件傳遞給外面的呼叫者。而“為RecyclerView的每個子item設定setOnClickListener”在Adapter中設定。其實直接在onClick中也能完全處理item的點選事件,但是這樣會破壞程式碼的邏輯。

步驟

1、在MyAdapter中定義介面

  1. public
    interfaceOnItemClickListener{
  2. void onItemClick(int position);
  3. }

2、宣告這個介面變數

  1. privateOnItemClickListener mItemClickListener;

3、在onCreateViewHolder()中為每個item新增點選事件

  1. @Override
  2. publicRecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
  3. View view =View.inflate(mContext, R.layout.item_linear,null
    );
  4. RecyclerView.ViewHolder holder =newLinearViewholder(view);
  5. view.setOnClickListener(this);
  6. return holder;
  7. }
  1. @Override
  2. publicvoid onClick(View v){
  3. if(mItemClickListener!=null){
  4. mItemClickListener.onItemClick((Integer) v.getTag());
  5. }
  6. }

4、注意上面呼叫介面的onItemClick()中的v.getTag()方法,這需要在onBindViewHolder()方法中設定和item相關的資料

  1. @Override
  2. publicvoid onBindViewHolder(RecyclerView.ViewHolder holder,int position){
  3. LinearViewholder viewholder =(LinearViewholder) holder;
  4. viewholder.mTextView.setText(mList.get(position));
  5. viewholder.itemView.setTag(position);
  6. }

5、提供set方法

  1. publicvoid setItemClickListener(OnItemClickListener itemClickListener){
  2. mItemClickListener = itemClickListener;
  3. }

6、在MainActivity中

  1. MyRecyclerViewAdapter adapter =newMyRecyalerViewAdapter();
  2. adapter.setItemClickListener(this);
  3. @Override
  4. publicvoid onItemClick(int position){
  5. Toast.makeText(this,""+position,Toast.LENGTH_SHORT).show();
  6. }