¿Cuál es el funcionamiento de setTag y getTag en el patrón de ViewHolder?
Tengo un fragmento de código simple para implementar listview personalizado.
Mi código es el siguiente:
- Fragmento implementando AsyncTask y Listview en android
- Botón de acción flotante Cambios de anclaje en la creación de vistas
- Android TextView Scrollable
- Android TabLayout no muestra contenido tan pronto como el fragmento se cambia
- MapView en un elemento de listaVer
WeatherAdapter.java:
public class WeatherAdapter extends ArrayAdapter<weather>{ Context mcontext; int mlayoutResourceId; weather mdata[] = null; View row; public WeatherAdapter(Context context, int layoutResourceId, weather[] data) { super(context, layoutResourceId, data); mlayoutResourceId = layoutResourceId; mcontext = context; mdata = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { row = convertView; WeatherHolder holder = null; if(row == null) { LayoutInflater inflater = ( (Activity) mcontext).getLayoutInflater(); row = inflater.inflate(mlayoutResourceId, parent, false); holder = new WeatherHolder(row); row.setTag(holder); } else { holder = (WeatherHolder)row.getTag(); } weather w = mdata[position]; holder.txtTitle.setText(w.mtitle); holder.imgIcon.setImageResource(w.micon); return row; }
WeatherHolder.java :
class WeatherHolder { ImageView imgIcon; TextView txtTitle; public WeatherHolder(View v){ imgIcon = (ImageView)row.findViewById(R.id.imgIcon); txtTitle = (TextView)row.findViewById(R.id.txtTitle); } } }
He visto tantas respuestas en SO y otros sitios y he entendido el mecanismo de reciclaje de listview.
También entendí que desde el espectador, podemos mantener las vistas del niño en el adaptador y no tenemos que llamar a findViewById()
muchas veces. Por lo tanto, es para la optimización.
Pero solo tengo la confusión en los setTag(holder)
y getTag()
. A partir de esta pregunta , llegué a saber que es para hacer un par clave-valor en varios objetos, para que podamos acceder a ellos fácilmente. Pero, no entiendo porqué son requeridos aquí … porque, no tenemos objetos múltiples del sostenedor … solamente que tenemos que cambiar las variables del sostenedor cada vez. ¿Podemos codificar aquí sin usar setTag
y getTag
?
Puede alguien explicar mejor que lo que setTag
y getTag
hacer "aquí"?
- Cómo hacer una lista <enum> parcelable?
- El último elemento de Listview está cortado
- Android restore instance state de un fragmento que está en backstack
- Actividad de inicio de Android al presionar elemento ListView de widget
- Cómo implementar simple como botón en listview de cada elemento
- Cómo hacer un fragmento desplazable con un ListView
- Error en el método ProgressDialog.dimiss cuando se llama por AsyncTask
- Actualizar fragmento actual (datos ListView) que permanece en la misma actividad
tag
es un mecanismo para hacer que tus views
recuerden algo, que podría ser un object
un integer
una string
o algo que te guste.
Por lo que cuando su ListView
va a crear por primera vez su convertView
es null
. Así que usted crea un nuevo convertView
y pone todas sus references
de los objects
de esa row
en un viewHolder
. Luego guarde su viewHolder
en la memoria de ese convertView
( setTag ). Android
toma su convertView
y lo pone en su pool
para recycle
y lo passes
nuevo a usted. Pero su pool
puede no tener lo suficiente convertViews
por lo que de nuevo pasa un nuevo convertView
thats null
. Así que otra vez la historia se repite hasta que la pool
del android
se llene para arriba. Después de que android
toma un convertView
de su piscina y pasa a usted. Usted encontrará que no es null
por lo que le pregunto dónde están mis references
objeto que le di por primera vez? ( GetTag ) así que usted conseguirá éstos y hará lo que usted tiene gusto.
Más información en la línea inferior
but its pool may not have enough convertViews so it again passes a new convertView thats null
La pool
Android está vacía cuando su listView
va a crear. Por lo que para el primer elemento de su listView
le envía un convertView
que debe mostrarse. Después de que el android
guarda en su pool
, por lo que su pool
ahora contiene sólo un convertView
. Para su segundo elemento de su listView
que va a crear android no puede usar su piscina porque en realidad tiene un elemento y ese elemento es su primer elemento y se está mostrando ahora, por lo que tiene que pasar otro convertView
. Este proceso se repite hasta que android
encontró un convertView
en su pool
thats no se muestra ahora y se lo pasa a usted.
Android infla cada fila hasta que la pantalla se llena después de que cuando se desplaza la lista que utiliza titular.
Permite buscar en una perspectiva diferente:
Vamos a imaginar que el helicóptero es la " fila ", mientras que la cuerda es el " setTag " y el coche de abajo es " WeatherHolder ", pero el piloto del helicóptero está dentro de ese coche y él / ella controlando el helicóptero usando un " TELÉFONO CABLEADO ".
Cuando cortamos la cuerda que es "setTag" el Hellicopter todavía vuela pero el piloto ya no puede controlarlo ya que el piloto es caer en el suelo lo que significa que el piloto está muerto! (En java cuando una pérdida de objeto su referencia el recolector de basura recogerá eso y liberará de la memoria).
Cuando usted no colocó o ató la cuerda al coche mientras que el helicóptero está a punto de volar donde el piloto se está sentando – usted pierde potencial un control en el helicóptero porque usted está utilizando "REMOTO CABLEADO".
Espero que esta ayuda :).
Pero, no entiendo porqué son requeridos aquí … porque, no tenemos objetos múltiples del sostenedor
Aquí es donde usted está equivocado – hay un titular por vista (también conocido como visible o en caché ListView entrada).
- ¿Eliminar todos los elementos almacenados en caché creados por un WebView?
- WebView doble toque zoom no funciona en un Motorola Droid A855