天天看点

给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。

继续阅读