【问题标题】:How to handle a lot of different view types in recyclerview viewholder如何在recyclerview viewholder中处理很多不同的视图类型
【发布时间】:2015-03-12 09:37:52
【问题描述】:

如果我有 50 种视图怎么办?我的适配器中应该有 50 个静态内部类吗? 根据this answer,是的。

我的第一个想法是将每个视图内部类移动到一个单独的公共类中,但它们必须是静态的。那么把每一个都封装成一个公共类,让内部类变成静态的?还有更好的选择吗?

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

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(...);
         ...
     }
}

【问题讨论】:

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

标签: android adapter android-recyclerview


【解决方案1】:

您只能使用一个 viewHolder 内部类来处理许多不同的 viewType。首先,您必须使用 getItemViewType(viewType) 来获取项目位置 并且还要根据viewType Position来使用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;
    }
}

希望这段代码对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多