RecyclerView自定义基础通用Adapter和ViewHolder

本文介绍了一种基于RecyclerView自定义Adapter和ViewHolder的方法,通过抽象基类实现数据绑定与点击监听,适用于多种布局需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RecyclerView自定义基础通用Adapter和ViewHolder

仅建立一个adapter,配合自定义布局holder,轻松搞定各种RecyclerView布局使用。

1、首先建立BaseViewHolder基础类
public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener{

    public MyAdapterListener myAdapterListener;
    protected Context context;

    public BaseViewHolder(Context context, ViewGroup root, int layoutRes, MyAdapterListener listener) {
        super(LayoutInflater.from(context).inflate(layoutRes, root, false));//super(View view)
        this.context=context;
        this.myAdapterListener =listener;
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
    }

    public Context getContext() {
        return itemView.getContext();
    }

    /**绑定数据入口*/
    public abstract void bindData(T t);

    @Override
    public void onClick(View v) {
        if(myAdapterListener !=null){
            myAdapterListener.onItemClick(getAdapterPosition());
        }
    }

    @Override
    public boolean onLongClick(View v) {
        if(myAdapterListener !=null){
            myAdapterListener.onItemLongClick(getAdapterPosition());
        }
        return true;
    }

}
其中MyAdapterListener监听点击事件类代码如下:
public interface MyAdapterListener {
    void onItemClick(int position);
    void onItemLongClick(int position);
}
2、再建立Adapter基础类
public abstract class BaseViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List msgs = new ArrayList<>();
    public void add2MsgList(List msgs){
        if (msgs == null) return;
        this.msgs = msgs;
    }

    public BaseViewAdapter(){
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return getHolder();
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((BaseViewHolder)holder).bindData(msgs.get(position));
    }

    @Override
    public int getItemCount() {
        return msgs.size();
    }

    public abstract BaseViewHolder getHolder();

}
至此准备工作已经全部做好,剩下的就只有我们的自定义Layout了。
3、建立一个自定义ViewHolder类,继承自BaseViewHolder:
public class MyViewHolder extends BaseViewHolder {

    public MyViewHolder(Context context, MyAdapterListener listener) {
        super(context, null, R.layout.item_list_simple, listener);//一个类对应一个布局文件
    }

    @Override
    public void bindData(Object o) {
        if (o==null) return;
        ((TextView)itemView).setText((String)o);
    }
}

其中 R.layout.item_list_simple 代码如下:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:clickable="true"
    android:id="@+id/textView"
    android:padding="10dp"
    android:text="1232433"
    android:background="@drawable/ripple_bg"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</TextView>
4、最后在activity里初始化和加载数据并添加监听器:
public class TestActivity extends Activity {

    RecyclerView recyclerView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fra_message_talk);

        LinearLayoutManager manager = new LinearLayoutManager(this);
        BaseViewAdapter adapter = new BaseViewAdapter() {
            @Override
            public BaseViewHolder getHolder() {
                return new MyViewHolder(getBaseContext(),listener);
            }
        };
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(manager);
        recyclerView.setAdapter(adapter);

        //添加数据
        List msgs = new ArrayList();
        for (int i = 0; i < 20; i++) {
            Log.d("logd","i = "+i);
            msgs.add(String.valueOf(i));
        }
        adapter.add2MsgList(msgs);
        adapter.notifyDataSetChanged();
    }

    MyAdapterListener listener = new MyAdapterListener() {
        @Override
        public void onItemClick(int position) {
            Log.d("logd","点击 位置="+position);
        }

        @Override
        public void onItemLongClick(int position) {
            Log.d("logd","长按点击 位置="+position);
        }
    };
}

其中 R.layout.fra_message_talk 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</LinearLayout>
看看效果:

这里写图片描述

点击效果:

这里写图片描述

当需要添加其他布局时候,新建一个ViewHolder类继承自BaseViewHolder就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值