Android 如何在recyclerview viewholder中处理许多不同的视图类型

Android 如何在recyclerview viewholder中处理许多不同的视图类型,android,adapter,android-recyclerview,Android,Adapter,Android Recyclerview,如果我有50种视图呢?我的适配器中应该有50个静态内部类吗? 据报道,是的 我的第一个想法是将每个viewholder内部类移动到一个单独的公共类中,但它们必须是静态的。那么,将每个类封装到一个公共类中,使内部类保持静态?还有更好的选择吗 编辑: 代码示例: 所以这是一个很好的解决方案?这不也会影响性能吗 public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener,

如果我有50种视图呢?我的适配器中应该有50个静态内部类吗? 据报道,是的

我的第一个想法是将每个viewholder内部类移动到一个单独的公共类中,但它们必须是静态的。那么,将每个类封装到一个公共类中,使内部类保持静态?还有更好的选择吗

编辑: 代码示例: 所以这是一个很好的解决方案?这不也会影响性能吗

public class MainViewHolder extends DragSortAdapter.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
View container;
TextView title;

//called in onCreateViewHolder in adapter
public MainViewHolder(DragSortAdapter adapter, View itemView) {
    super(adapter, itemView);

    container = itemView.findViewById(R.id.card_root);

    title = container.findViewById(R.id.text);
}
//called by onBindViewHolder in adapter
public void setData(Data data) {
    title.setText(data.title);
}
}
编辑2: 示例,用于返回viewholder的新实例时

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     switch (viewType) {
         case 0: return new MainViewHolder(...);
         case 2: return new MainViewHolderOther(...);
         ...
     }
}

您只能使用一个viewHolder内部类来处理许多不同的viewType。首先,您必须使用getItemViewType(viewType)获取项目位置 并且还必须根据viewType位置使用viewHolder

制作一个vieHolder内部类,在该类中,您可以根据项目的位置传递视图和视图类型,并按如下代码所示对布局进行充气。 下面给出了代码示例

public class Adapter extends
        RecyclerView.Adapter<Adapter.MyViewholder> {

LayoutInflater inflater;
private Context context;
ArrayList<Detail> data = new ArrayList<Detail>();

public Adapter(Context context, ArrayList<Detail> getdata) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = getdata;
}

class MyViewholder extends RecyclerView.ViewHolder {
    TextView txtRow, txt_rec;

    public MyViewholder(View view, int type) {
        super(view);

        if (type == Constants.NORMAL) {
            txtRow = (TextView) view
                    .findViewById(R.id.txtRow);
        } else if (type == Constants.RECORDING) {
            txt_rec = (TextView) view
                    .findViewById(R.id.txt_rec);
        } 
    }
}

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

@Override
public void onBindViewHolder(MyViewholder viewholder, int position) {
    int listViewItemType = getItemViewType(position);
    Detail detail = data.get(listViewItemType);
    if (detail.getType() == Constants.NORMAL) {
        viewholder.txtRow.setText(detail.getKey());
    } else if (detail.getType() == Constants.RECORDING) {
        viewholder.txt_rec.setText(detail.getRecording());
    } 

}

@Override
public MyViewholder onCreateViewHolder(ViewGroup parent, int viewType) {

    int listViewItemType = getItemViewType(viewType);
  switch (listViewItemType) {
         case 0: 
              view = inflater.inflate(R.layout.detail_item, parent,
                    false);
            myViewholder = new MyViewholder(view, Constants.NORMAL);
         case 2: 
             view = inflater.inflate(R.layout.recording, parent, false);
            myViewholder = new MyViewholder(view, Constants.RECORDING);
    }
    return myViewholder;
}

@Override
public int getItemViewType(int position) {
        return position;
    }
}
公共类适配器扩展
RecyclerView.适配器{
充气机;
私人语境;
ArrayList数据=新的ArrayList();
公共适配器(上下文,ArrayList getdata){
this.context=上下文;
充气器=充气器。从(上下文);
this.data=getdata;
}
类MyViewholder扩展了RecyclerView.ViewHolder{
TextView txtRow,txt_rec;
公共MyViewholder(视图,int类型){
超级(视图);
if(类型==常量.NORMAL){
txtRow=(TextView)视图
.findviewbyd(R.id.txtRow);
}else if(类型==常量.录制){
txt_rec=(文本视图)视图
.findviewbyd(R.id.txt_rec);
} 
}
}
@凌驾
public int getItemCount(){
返回data.size();
}
@凌驾
BindViewHolder上的公共无效(MyViewholder viewholder,int位置){
int listViewItemType=getItemViewType(位置);
Detail Detail=data.get(listViewItemType);
if(detail.getType()==Constants.NORMAL){
viewholder.txtRow.setText(detail.getKey());
}else if(detail.getType()==Constants.RECORDING){
viewholder.txt_rec.setText(detail.getRecording());
} 
}
@凌驾
公共MyViewholder onCreateViewHolder(视图组父级,int-viewType){
int listViewItemType=getItemViewType(viewType);
开关(listViewItemType){
案例0:
视图=充气机。充气(R.布局.细节\u项目,父项,
假);
myViewholder=新的myViewholder(视图,常量.NORMAL);
案例2:
视图=充气机。充气(R.layout.recording,parent,false);
myViewholder=新的myViewholder(视图,常量.录制);
}
返回myViewholder;
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
}

希望这段代码能帮助您

为什么您认为顶级类不是静态的?你能添加一些代码示例来阐明你的意思吗?为什么它们必须是静态的?@Niekharman顶级公共类在java中不能是静态的。@Tamas顶级类的定义是静态的。并且ViewHolder模式“要求”它,以便ViewHolder实例没有对其外部类的引用。将静态内部ViewHolder类设置为顶级类具有完全相同的结果。如果有20个类型,每个类型有1个项目,
ViewHolder
模式无效。
ViewHolder
模式仅在相同的
视图
可用于
列表视图中的多个项目时才有用。这就提出了一个问题,你是否真的需要这20种类型。例如,不同的背景色不需要是不同的类型。