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