Tengo un ListView con diferentes diseños para diferentes elementos. Algunos artículos son separadores. Algunos elementos son diferentes porque contienen diferentes tipos de datos, etc.Crear ViewHolders para ListViews con diferentes diseños de elementos
Quiero implementar ViewHolders para acelerar el proceso getView, pero no estoy muy seguro de cómo hacerlo. Diferentes diseños tienen diferentes datos (lo que hace que nombrar sea difícil) y diferentes números de Vistas que quiero usar.
¿Cómo debo hacer esto?
La mejor idea que se me ocurre es crear un ViewHolder genérico con X elementos donde X es el número de Vistas en un diseño de elemento con el mayor número de ellas. Para las otras vistas con un número pequeño de Vistas, solo usaré una subsección de esas variables en el ViewHolder. Entonces, digo que tengo 2 diseños que uso para 2 artículos diferentes. Uno tiene 3 TextViews y el otro 1. He creado un ViewHolder con 3 variables TextView y solo uso 1 de ellos para el otro elemento. Mi problema es que esto puede ser realmente feo y se siente realmente hacky; especialmente cuando el diseño de un elemento puede tener muchas Vistas de muchos tipos diferentes.
Aquí es una getView muy básico:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder holder;
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.layout_mylistlist_item, parent, false);
holder = new MyHolder();
holder.text = (TextView) v.findViewById(R.id.mylist_itemname);
v.setTag(holder);
}
else {
holder = (MyHolder)v.getTag();
}
MyListItem myItem = m_items.get(position);
// set up the list item
if (myItem != null) {
// set item text
if (holder.text != null) {
holder.text.setText(myItem.getItemName());
}
}
// return the created view
return v;
}
Supongamos que tenía diferentes tipos de diseños de filas, que podría tener una ViewHolder para cada tipo de fila. ¿Pero qué tipo declararía "titular" para estar en la parte superior? O declararía un titular para cada tipo y luego usaría el que corresponde al tipo de fila en la que estoy.
Quizá necesito un poco de cepillado en mi Java a continuación. Al comienzo de las funciones de getView en mi ListActivities, creo una instancia de mi poseedor definido para ese ListView. Luego reviso convertView para null y getTag o creo el titular y establezco los elementos. Si voy a utilizar diferentes titulares para los tipos de elementos, ¿qué debería declarar mi titular como al inicio de getView? ¿O necesito crear una instancia 1 para todos mis tipos de elementos e inicializar y usar la que corresponde al tipo de fila? – Andrew
Consulte mi publicación editada arriba – Andrew
@Andrew, cada titular se definiría individualmente en una de las declaraciones de casos. Coloque todo su código existente en la declaración de caso ecah, pero cambie el tipo de usuario y el manejo de datos para cada uno. Editaré mi respuesta con un ejemplo en un momento. – CodeFusionMobile