¿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:

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í"?

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:

Introduzca aquí la descripción de la imagen

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).

  • Fragmento onListItemClick
  • ¿Dónde puedo obtener una lista de nombres Build.MODEL para todos los dispositivos Android?
  • Agregar vistas de forma programática en un diseño (lineal) (que está dentro de un ScrollView)
  • YouTubePlayerFragment en ListView con AppCompatActivity Error
  • Mejores prácticas de administración de fragmentos para varios ListFragments
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.