通过接口回调方式来设置RecyclerView的条目点击监听事件

提到RecyclerView大家总会拿它与ListView相比较, RecyclerView是具有比ListView更具扩展性的控件, RecyclerView继承的是ViewGroup, 可以说也是ViewGroup的官方定义控件, RecyclerView顾名思义其专注于Recycler复用, 它不再管理布局, RecyclerView的布局由LayoutManager来管理了, Adapter的使用也不再像ListView那样继承BaseAdapter, 而是继承其内部类的RecyclerView.Adapter, 它是一个泛型类, 通常我们喜欢把它的泛型设置为RecyclerView.ViewHolder, RecyclerView.ViewHolde显然也是一个RecyclerView的内部类, 可见RecyclerView已经把Adapter和ViewHolder完全封装成自己的内部类, 其高度的Recycler思想可想而知.

RecyclerView的使用通常会涉及到一下几个方法:

// 1.配置效率
mRecyclerView.setHasFixedSize(true);

// 2.配置布局
mRecyclerView.setLayoutManager(new  LinearLayoutManager(this));

// 3.配置Adapter
mCustomAdapter = new CustomAdapter(this, mDatas);
mRecyclerView.setAdapter(mCustomAdapter);

发现并没有像ListView那样直接设置条目点击监听的方法, 如何实现RecyclerView的条目点击监听呢?这里采用接口回调的方式实现;

先看RecyclerView的Adapter代码

package com.suosuoshu.recyclerview;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

// 自定义CustomAdapter 继承RecyclerView.Adapter
public class CustomAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context mContext;
    private List<Student> mDatas;

    // 采用接口回调的方式实现RecyclerView的ItemClick
    public OnRecyclerViewListener mOnRecyclerViewListener;


    // 接口回调第一步: 定义接口和接口中的方法
    interface OnRecyclerViewListener {

        void onItemClick(int position);

        boolean onItemLongClick(int position);
    }

    // 接口回调第二步: 初始化接口的引用
    public void setOnRecyclerViewListener(OnRecyclerViewListener l) {
        this.mOnRecyclerViewListener = l;
    }

    public CustomAdapter(Context context, List<Student> datas) {
        mContext = context;
        mDatas = datas;
    }

    // 自定义ViewHolder
    public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

        public final TextView mTextName;
        public final TextView mTextAge;
        // 注意这里的position与CustomViewHolder是对应的关系, 每个CustomViewHolder都有mTextName和mTextAge, 还有它的mPosition
        public int mPosition;

        public CustomViewHolder(View itemView) {
            super(itemView);
            mTextName = (TextView) itemView.findViewById(R.id.name);
            mTextAge = (TextView) itemView.findViewById(R.id.age);
            // 巧妙的调用了View的点击方法
            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }

        // 接口回调第三步, 实现onClick, 方法中是调用了接口的onItemClick抽象方法, 所以这里之后肯定会被回调回来
        @Override
        public void onClick(View v) {
            if (mOnRecyclerViewListener != null) {
mOnRecyclerViewListener.onItemClick(mPosition);
            }
        }

        @Override
        public boolean onLongClick(View v) {
            if (mOnRecyclerViewListener != null) {
                return mOnRecyclerViewListener.onItemLongClick(mPosition);
            }
            return false;
        }
    }

// RecyclerView.Adapter的三个抽象方法实现
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.itme_layout, null);
        CustomViewHolder customViewHolder = new CustomViewHolder(view);
        return customViewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        CustomViewHolder customViewHolder = (CustomViewHolder) holder;
        customViewHolder.mTextName.setText(mDatas.get(position).name);
        customViewHolder.mTextAge.setText(mDatas.get(position).age);
        customViewHolder.mPosition = position;
    }

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

这是MainActivity 中的代码

package com.suosuoshu.recyclerview;

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

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

public class MainActivity extends AppCompatActivity implements CustomAdapter.OnRecyclerViewListener {

    private RecyclerView mRecyclerView;
    private List<Student> mDatas;
    private CustomAdapter mCustomAdapter;

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

        initView();
        initData();
    }
    // 初始化控件
    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    }
    // 初始化数据
    private void initData() {
    // 这里是模拟数据
        mDatas = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            Student student = new Student("明明", "18");
            mDatas.add(student);
        }

        // 1.配置效率
        mRecyclerView.setHasFixedSize(true);

        // 2.配置布局
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 3.配置Adapter
        mCustomAdapter = new CustomAdapter(this, mDatas);
        mRecyclerView.setAdapter(mCustomAdapter);

        // 4.注意, 是让Adapter去设置点击监听事件,setOnRecyclerViewListener方法是在CustomAdapter中定义的
        mCustomAdapter.setOnRecyclerViewListener(this);
    }

// 接口回调第四步, 这是才是最终被调用的方法
    @Override
    public void onItemClick(int position) {
        Toast.makeText(MainActivity.this, "点击了第" + position + "个条目", Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onItemLongClick(int position) {
        return false;
    }
}

一个简单的Bean类模拟数据

package com.suosuoshu.recyclerview;
public class Student {
    public String name;
    public String age;

    public Student(String name, String age) {
        this.name = name;
        this.age = age;
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值