Как обрабатывать множество разных типов вида в просмотре пользователя recyclerview

Что делать, если у меня 50 видов просмотров? Должен ли я иметь 50 статических внутренних классов в моем адаптере? Согласно этому ответу , да.

Моя первая мысль заключалась в том, чтобы переместить каждый внутренний класс зрителя в отдельный публичный класс, но они должны быть статическими. Итак, инкапсулируйте каждый из них в открытый класс, чтобы сделать внутренний класс статическим? Есть ли лучшие альтернативы?

Edit: code sample: Итак, это было бы хорошим решением? Разве это не убивает производительность?

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

Edit2: sample, для которого возвращается новый экземпляр

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

Solutions Collecting From Web of "Как обрабатывать множество разных типов вида в просмотре пользователя recyclerview"

Вы можете использовать только один внутренний класс viewHolder для обработки множества разных типов viewType. Во-первых, вам нужно использовать getItemViewType (viewType), чтобы получить позицию позиции, а также использовать viewHolder в соответствии с позицией viewType.

Сделайте один внутренний класс 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; } } 

Надеюсь, этот код поможет вам