Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo manejar un montón de diferentes tipos de vista en el visor de recyclerview

¿Qué pasa si tengo 50 tipos de puntos de vista? ¿Debo tener 50 clases internas estáticas en mi adaptador? De acuerdo con esta respuesta , sí.

Mi primer pensamiento fue mover cada clase interna del espectador en una clase pública separada, pero tienen que ser estática. ¿Así encapsular cada uno en una clase pública, para hacer la clase interna estática? ¿Hay alternativas más agradables?

Editar: ejemplo de código: ¿Así que esto sería una buena solución? ¿Esto no mata también el rendimiento?

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, para cuando se devuelve una nueva instancia del visor

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

  • Cómo centrar RecyclerView elementos horizontalmente con vertical GridLayoutManager
  • Selección de un valor RadioButton y desplazamiento hacia atrás eliminando el seleccionado en RecyclerView
  • Configuración dinámica de una altura fija para una vista de cuadrícula escalonada
  • Margen entre elementos en reciclado ver Android
  • Facebook NativeAdsManager saliendo de la excepción de memoria en RecyclerView
  • Cómo superponer elementos en LinearLayoutManager - RecyclerView (como tarjetas de apilado)
  • ¿Cómo utilizar ContentObserver con RecyclerView?
  • Cómo configurar la aplicación RecyclerView: layoutManager = "" de XML?
  • One Solution collect form web for “Cómo manejar un montón de diferentes tipos de vista en el visor de recyclerview”

    Sólo puede utilizar una clase interna viewHolder para manejar gran cantidad de diferentes tipos de vista. En primer lugar usted tiene que usar getItemViewType (viewType) para obtener la posición del artículo y también tiene que usar viewHolder de acuerdo a viewType Posición.

    Hacer una clase interna de vieHolder en la que puede pasar vista y tipo de vista según la posición del elemento e inflar el diseño como se muestra a continuación código. La muestra de código se da a continuación.

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

    Espero que este código te ayude

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.