Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重用RecyclerView适配器_Java_Android_Listview_Android Recyclerview_Adapter - Fatal编程技术网

Java 重用RecyclerView适配器

Java 重用RecyclerView适配器,java,android,listview,android-recyclerview,adapter,Java,Android,Listview,Android Recyclerview,Adapter,我这里有一个很小的问题,在我的循环视图适配器类中,我使用的是List,它工作正常 现在我们新引入了一个名为“FeaturedLangTags”的类,FeaturedTags和FeaturedLangTags之间唯一的区别就是添加了Lang字段。但我们并没有使用这个Lang字段在屏幕上显示 回收视图的输出看起来与现有的FeaturedTags适配器非常相似。在这里,我想知道如何重用现有的适配器类来显示List项 一种简单的方法是复制现有适配器并传递FeaturedLangTags列表,但这里有太多

我这里有一个很小的问题,在我的循环视图适配器类中,我使用的是
List
,它工作正常

现在我们新引入了一个名为“
FeaturedLangTags
”的类,
FeaturedTags
FeaturedLangTags
之间唯一的区别就是添加了
Lang
字段。但我们并没有使用这个Lang字段在屏幕上显示

回收视图的输出看起来与现有的
FeaturedTags
适配器非常相似。在这里,我想知道如何重用现有的适配器类来显示
List


一种简单的方法是复制现有适配器并传递
FeaturedLangTags
列表,但这里有太多的代码被复制。我想知道如何查看现有类?

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


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

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

创建泛型
列表的适配器,这两种情况都可以使用

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);
公共抽象类GenericaAdapter扩展了RecyclerView.Adapter{
私人语境;
私有ArrayList项;
公共摘要RecyclerView.ViewHolder setViewHolder(视图组父级);
BindData上的公共摘要无效(RecyclerView.ViewHolder,T val);
公共通用适配器(上下文、ArrayList项){
this.context=上下文;
这个项目=项目;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
RecyclerView.ViewHolder=setViewHolder(父级);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
onBindData(holder,items.get(position));
}
@凌驾
public int getItemCount(){
返回items.size();
}
公共无效附加项(ArrayList savedCardItemz){
items=savedCardItemz;
this.notifyDataSetChanged();
}
公共T getItem(内部位置){
返回项目。获取(位置);
}
}
适配器=新的GenericaAdapter(上下文,模型列表){
@凌驾
public RecyclerView.ViewHolder setViewHolder(视图组父级){
最终视图=LayoutFlater.from(上下文)。充气(R.layout.item\u View\u holder,parent,false);
ItemViewHolder viewHolder=新的ItemViewHolder(上下文,视图);
返回视图持有者;
}
@凌驾
BindData上的公共无效(RecyclerView.ViewHolder holder1,DataModel val){
DataModel userModel=val;
ItemViewHolder=(ItemViewHolder)holder1;
holder.name.setText(userModel.getName());
holder.fatherName.setText(userModel.getFatherName());
}
};
mRecyclerView.setAdapter(适配器);

您可以让这两个类实现一个公共接口,比如说CommonInterface

把你的类型列出来

YourList<CommonInterface>
方法。这里使用操作符的实例来检查它是什么类型的类,并返回一个视图类型整数。比如说,如果没有lang,它将是一个整数0,加上它,1

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

在onBindViewHolder中,您可以检查

getItemViewType 
在holder上,传入参数并将接口显式转换为所需的对象。然后像往常一样使用它

此多视图类型的参考是

但是,如何获取数据?。i、 e onBindViewHolder方法?
getItemViewType