美文网首页Android
BaseRecyclerViewAdapter

BaseRecyclerViewAdapter

作者: ACap | 来源:发表于2019-02-13 10:27 被阅读0次

BaseRecyclerViewAdapter是一个RecyclerView的万能适配器,它的内部维护一个数据集合,当数据发生变化的时候自动反映到UI上。

实现以下功能

ItemView点击长按事件监听
Adapter数据变化监听
ViewHolder消息
懒人模式
AndroidX

BaseRecyclerViewAdapter

内部维护多个数据集合,它会根据数据的变化自动更新UI

set()
add()
insert()
move()
replace()
**Only() Only方法只改变数据源,需要手动刷新UI

ItemView点击和长按监听

不需要ViewHolder做任何适配,完美实现点击事件监听

Adapter.setOnItemClickListener()
Adapter.setOnItemLongClickListener()

1.在RecyclerView中没有类似ListView的点击长按事件监听,需要我们在ViewHolder中自己处理点击事件,使用起来比较麻烦。而且直接给ViewHolder的itemView设置点击事件会出现一些问题。
2.我的处理方法是在itemView创建的时候给他设置点击监听器,然后在它外面包裹一层FragmentLayout用来当作真正的itemView,原来的itemView就变成了它的内容。
3.不需要对ViewHolder做任何改动完美实现点击事件监听

数据变化监听

对Adapter中数据变化做出响应

Adapter.setOnAdapterDataChangeListener()

1.显示调用改变数据的方法 Set() | Add() | Insert() || Move() || replace() 会自动回调该方法
2.其他情况通过手动调用Adapter或Viewholder中的 notifyDataChange() 方法来通知数据变化

ViewHolder消息

Adapter.addViewHolderMessageHandler()

1.在Adapter与Viewholder中调用sendMessage()来发送一条消息到Adapter的消息监听器中

懒人模式 BaseLoonRecyclerViewAdapter 与 SimpleRecyclerViewAdapter

BaseLoonRecyclerViewAdapter允许不创建ViewHolder,只需要创建Adapter

    private static final class MyAdapter extends BaseLoonRecyclerViewAdapter<String, BaseLoonViewHolder> {
        public MyAdapter() {
            super(R.layout.layout_textview);
        }

        @Override
        public void convert(BaseLoonViewHolder<String> helper, String data) {
            if (TextUtils.isEmpty(data)) {
                helper.setText(R.id.view_Info, "IS  NULL  !!");
            } else helper.setText(R.id.view_Info, data);
        }
    }

SimpleRecyclerViewAdapter允许不自定义Adapter。
使用方式:

//Class<? extends BaseViewHolder<D>>   :设置被Adapter加载的ViewHolder
//layoutResId  :Viewholder使用的布局
recyclerView.setAdapter(new SimpleRecyclerViewAdapter(Class<? extends BaseViewHolder<D>>,layoutResId));

配置依赖

在项目的build.gradle中添加

allprojects {
    repositories {
        maven { url 'https://www.jitpack.io' }
    }
}

在Model的build.gradle中添加

dependencies {
    implementation 'com.github.ftmtshuashua:BaseRecyclerViewAdapter:version'
}

需要库

implementation 'androidx.recyclerview:recyclerview:version'

混淆配置

-keepclassmembers class * extends support.lfp.adapter.BaseViewHolder{
    public <init>(android.view.View);
}

一个例子

public class ViewHolderMessageActivity extends Activity {

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

        ListAdapter mAdapter = new ListAdapter();
        new RecyclerView(this).setAdapter(mAdapter);
        mAdapter.setOnAdapterDataChangeListener(adapter -> {
            /* 数据变化监听 */
            final List<Model> data = adapter.getData();//当数据发生变化的时候拿到数据源
        });
        mAdapter.setOnItemClickListener((adapter, viewHolder, view, position) -> {
            /*点击监听*/
        });
        mAdapter.setOnItemLongClickListener((adapter, viewHolder, view, position) -> {
            /*长按监听*/
            return true;
        });
        mAdapter.addViewHolderMessageHandler((what, obj, layoutIndex) -> {
            /*ViewHolder消息处理器*/
            if (what == 666) {
                Model data = obj;
            }
        });


        mAdapter.add(new Model("数据"));
    }

    /*自定义Adapter*/
    static final class ListAdapter extends BaseLoonRecyclerViewAdapter<Model, BaseLoonViewHolder> {
        public ListAdapter() {
            super(R.layout.activity_main);//这里是ViewHolder加载的布局文件
        }

        @Override
        public void convert(BaseLoonViewHolder<Model> holper, Model data) {
            sendMessage(666, data, holper.getDataPosition());//在Adapter或ViewHolder中广播一条消息
            notifyDataChange();//在Adapter或ViewHolder中显示通知数据变化,它会回调数据变化监听器
        }
    }

    /*数据模型*/
    static final class Model {
        String name;

        public Model(String name) {
            this.name = name;
        }
    }
}

相关文章

网友评论

    本文标题:BaseRecyclerViewAdapter

    本文链接:https://www.haomeiwen.com/subject/cjqqeqtx.html