天天看點

給RecyclerView通用Adapter添加Item單擊事件

接上一篇,現在給我們上篇博文中的通用Adapter加上Item單擊事件。

重新生成一個帶點選事件接口的Adapter —— WithItemClickAdapter

package com.dfsebook.myrecycleradapter.adapter;

import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

/**
 * Created by Administrator on 16-7-18.
 */
public class WithItemClickAdapter<T>
        extends RecyclerView.Adapter<WithItemClickAdapter.WithItemClickViewHolder>{

    private List<T> mDatas;

    private int layoutId;

    private int brId;

    private ItemClickLister itemClickLister;

    public void setItemClickLister(ItemClickLister itemClickLister) {
        this.itemClickLister = itemClickLister;
    }

    public WithItemClickAdapter(List<T> mDatas, int layoutId, int brId) {
        this.mDatas = mDatas;
        this.layoutId = layoutId;
        this.brId = brId;
    }

    @Override
    public WithItemClickViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        ViewDataBinding binding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
        WithItemClickViewHolder viewHolder = new WithItemClickViewHolder(binding.getRoot());
        viewHolder.setBinding(binding);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(WithItemClickAdapter.WithItemClickViewHolder holder, int position) {
        holder.getBinding().setVariable(brId,mDatas.get(position));
        holder.getBinding().executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }

    public class WithItemClickViewHolder extends RecyclerView.ViewHolder
            implements View.OnClickListener {

        private View itemView;

        private ViewDataBinding binding;

        public ViewDataBinding getBinding() {
            return binding;
        }

        public void setBinding(ViewDataBinding binding) {
            this.binding = binding;
        }

        public WithItemClickViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            this.itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if(itemClickLister != null)
                itemClickLister.onItemClick(getLayoutPosition());
        }
    }

    public interface ItemClickLister{
        void onItemClick(int position);
    }
}
           

          于上篇不同的是,在Adapter中生成一個内部類繼承自RecyclerView.ViewHolder,并實作了View.OnClickListener方法。同時給Adapter添加Item單擊接口ItemClickListener,在ViewHolder中傳遞點選位置資訊,這裡是int資料getLayoutPosition。

第二步:代碼實作

<span style="font-size:14px;">package com.dfsebook.myrecycleradapter.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import com.dfsebook.myrecycleradapter.BR;
import com.dfsebook.myrecycleradapter.R;
import com.dfsebook.myrecycleradapter.adapter.WithItemClickAdapter;
import com.dfsebook.myrecycleradapter.bean.Student;
import com.dfsebook.myrecycleradapter.utils.InitRecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
        implements WithItemClickAdapter.ItemClickLister{

    private List<Student> students;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.show_list);
        InitRecyclerView.initLinearLayoutVERTICAL(this,recyclerView);
        students = new ArrayList<>();
        Student student = new Student(R.drawable.tx2,"Kate");
        students.add(student);
        student = new Student(R.drawable.tx3,"Alen");
        students.add(student);
        student = new Student(R.drawable.tx4,"Johnson");
        students.add(student);
        student = new Student(R.drawable.tx5,"Make");
        students.add(student);

        WithItemClickAdapter<Student> adapter = new WithItemClickAdapter<>(students,R.layout.student_item,BR.student);
        adapter.setItemClickLister(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(int position) {
        Toast.makeText(MainActivity.this, students.get(position).getName(), Toast.LENGTH_LONG).show();
    }
}</span>
           

這樣就實作了Item單擊功能,就不上截圖了。

同樣的方法可為RecyclerView添加長按事件OnItemLongClickListener,在這兒就不上代碼了。

下一篇我們為R ecyclerView添加頭部HeadView。

繼續閱讀