重用RecyclerView适配器

时间:2017-12-30 18:09:18

标签: java android listview android-recyclerview adapter

我在这里有一个非常小的问题,在我的循环视图适配器类中,我正在使用List<FeaturedTags>并且它正常工作。

现在我们新推出了一个名为“FeaturedLangTags的课程,FeaturedTags&amp; FeaturedLangTags只是Lang字段的补充。但是我们还没有使用这个Lang字段来显示在屏幕上。

循环视图的输出看起来与现有的FeaturedTags适配器完全相似。在这里,我想知道如何重用现有的适配器类来显示List<FeaturedLangTags>项目?

一种简单的方法是复制现有的适配器并传递FeaturedLangTags列表,但是这里的代码很多都是重复的。我想知道我如何调整现有的课程?

4 个答案:

答案 0 :(得分:2)

创建通用List<T>的适配器,可以在两种情况下使用。

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private ArrayList<T> items;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public GenericAdapter(Context context, ArrayList<T> items){
        this.context = context;
        this.items = items;
    }

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

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        onBindData(holder,items.get(position));
    }

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

    public void addItems( ArrayList<T> savedCardItemz){
        items = savedCardItemz;
        this.notifyDataSetChanged();
    }

    public T getItem(int position){
        return items.get(position);
    }
}


adapter = new GenericAdapter<DataModel>(context,modelList) {
        @Override
        public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) {
            final View view =            LayoutInflater.from(context).inflate(R.layout.item_view_holder, parent, false);
            ItemViewHolder viewHolder = new ItemViewHolder(context, view);
            return viewHolder;
        }

        @Override
        public void onBindData(RecyclerView.ViewHolder holder1, DataModel val) {
                DataModel userModel = val;

                ItemViewHolder holder = (ItemViewHolder)holder1;
                holder.name.setText(userModel.getName());
                holder.fatherName.setText(userModel.getFatherName());
        }
    };
    mRecyclerView.setAdapter(adapter);

答案 1 :(得分:0)

FeaturedTagsFeaturedLangTags创建一个公共接口或超类,然后使用相同的适配器。

或者对您的适配器使用更通用的方法,例如AdapterDelegates

答案 2 :(得分:0)

您可以为适配器创建两个不同的构造函数并实现它。

答案 3 :(得分:0)

您可以让这两个类实现一个通用接口,例如CommonInterface

制作类型列表

YourList<CommonInterface>

在适配器中,覆盖

getItemViewType

方法。这里使用operator的实例来检查它是什么类型的类并返回一个视图类型整数。比如没有lang,它将是一个整数0并且与它一起,1

现在在onCreateViewHolder中,您将传递viewType作为第二个参数。使用它可以将您的布局扩展为视图的选择。

在你的onBindViewHolder中,你可以检查

getItemViewType 

在传递参数的持有者中,将您的界面显式地转换为您想要的对象。然后像往常一样使用它。

此多种视图类型的参考是 Recycler view multiple view types