android:具有数据绑定的通用recyclerview适配器 [英] android : generic recyclerview adapter with data binding

查看:130
本文介绍了android:具有数据绑定的通用recyclerview适配器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试如下创建通用的Recyclerview适配器:

I have tried to create a generic Recyclerview adapter as below:

BaseRecyclerAdapter:

public class BaseRecyclerAdapter<T, MVH extends BaseViewHolder<T>, EVH extends BaseViewHolder<T>> extends RecyclerView.Adapter<BaseViewHolder<T>> {

    private static final int VIEW_TYPE_EMPTY = 0;
    private static final int VIEW_TYPE_DATA = 1;
    private List<T> list = new ArrayList<>();
    @LayoutRes
    private int emptyViewLayoutResource;
    private Class<EVH> emptyViewHolder;
    @LayoutRes
    private int dataLayoutResource;
    private Class<MVH> dataViewHolder;

    public BaseRecyclerAdapter(int emptyViewLayoutResource, Class<EVH> emptyViewHolder, int dataLayoutResource, Class<MVH> dataViewHolder) {
        this.emptyViewLayoutResource = emptyViewLayoutResource;
        this.emptyViewHolder = emptyViewHolder;
        this.dataLayoutResource = dataLayoutResource;
        this.dataViewHolder = dataViewHolder;
    }

    @Override
    public BaseViewHolder<T> onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType == VIEW_TYPE_EMPTY ? emptyViewLayoutResource : dataLayoutResource, parent, false);
        try {
            return viewType == VIEW_TYPE_EMPTY ? emptyViewHolder.getConstructor(ViewDataBinding.class).newInstance(binding) : dataViewHolder.getConstructor(View.class).newInstance(binding);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onBindViewHolder(BaseViewHolder<T> holder, int position) {
        int viewType = getItemViewType(position);
        if (viewType == VIEW_TYPE_EMPTY) {

        } else {
            holder.bind(list.get(position));
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        return list.size() == 0 ? VIEW_TYPE_EMPTY : VIEW_TYPE_DATA;
    }
}

BaseViewHolder:

public class BaseViewHolder<T> extends RecyclerView.ViewHolder {
    private final ViewDataBinding binding;

    public BaseViewHolder(ViewDataBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public void bind(T t) {
        binding.setVariable(BR.obj, t);
        binding.executePendingBindings();
    }
}

任何人都可以尝试一下,并建议我如何初始化该类以与RecyclerView一起使用吗?

Can anyone try with this and suggest me how do I initialise this class to use it with RecyclerView ?

推荐答案

我想要的:我需要将Model传递给Layout,显然我们需要使用其属性进行绑定.这就是为什么我想到将BaseViewHolder设为通用类.

What I wanted: I needed Model to be passed to Layout, obviously We needed to use its properties to bind. This is why I thought of making BaseViewHolder a generic class.

实际问题:您无法获得通用类的类.意思是,我无法按以下方式初始化BaseRecyclerAdapter:

Actual Problem: You cannot get Class of Generic Class. Means, I cannot initialise BaseRecyclerAdapter as below:

private BaseRecyclerAdapter1<Model, EmptyViewHolder, ModelViewHolder> baseRecyclerAdapter1 = new BaseRecyclerAdapter1<>(R.layout.layout_empty, EmptyViewHolder<Model>.class, R.layout.list_item, ModelViewHolder<Model>.class);

解决方案:感谢数据绑定. <variable />标签为您进行类型转换.

Solution: Thanks to data binding. <variable /> tag does the type casting for you.

public class BaseViewHolder extends RecyclerView.ViewHolder {
    private final ViewDataBinding binding;

    public BaseViewHolder(ViewDataBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public void bind(Object object) {
        binding.setVariable(BR.obj, object);
        binding.executePendingBindings();
    }
}

因此,现在我可以将BaseRecyclerAdapter初始化为:

So, now I can initialise BaseRecyclerAdapter as:

private BaseRecyclerAdapter1<Model, EmptyViewHolder, ModelViewHolder> baseRecyclerAdapter1 = new BaseRecyclerAdapter1<>(R.layout.layout_empty, EmptyViewHolder.class, R.layout.list_item, ModelViewHolder.class);

在布局中:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <import type="android.view.View" />

        <variable
            name="obj"
            type="com.xxx.Model" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </LinearLayout>
</layout>

快乐编码.. !!

这篇关于android:具有数据绑定的通用recyclerview适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆