uso studio propiedades imagenes gridlayout example descargar con android android-listview android-gridview

android - studio - Cómo funciona el mecanismo de reciclaje de ListView



propiedades gridview android (3)

Inicialmente, también desconocía el reciclaje de listas y el mecanismo de uso de conversiones, pero después de una investigación de días enteros comprendí los mecanismos de la vista de lista al referirme a una imagen de android.amberfog

Cuando su lista de lista se llena con un adaptador, básicamente muestra el número de filas que la vista de lista puede mostrar en la pantalla y el número de filas no aumenta incluso cuando se desplaza por la lista, este es el truco que usa Android para que la vista de lista funcione más eficientemente y rápido, ahora la historia interna de listview se refiere a la imagen como se puede ver inicialmente, la vista de lista tiene 7 elementos visibles, si se desplaza hacia arriba cuando el elemento 1 ya no es visible, getView () pasa esta vista (elemento1) a reciclador y puede utilizar

System.out.println("getview:"+position+" "+convertView);

dentro de tu

public View getView(final int position, View convertView, ViewGroup parent) { System.out.println("getview:"+position+" "+convertView); ViewHolder holder; View row=convertView; if(row==null) { LayoutInflater inflater=((Activity)context).getLayoutInflater(); row=inflater.inflate(layoutResourceId, parent,false); holder=new PakistaniDrama(); holder.tvDramaName=(TextView)row.findViewById(R.id.dramaName); holder.cbCheck=(CheckBox)row.findViewById(R.id.checkBox); row.setTag(holder); } else { holder=(PakistaniDrama)row.getTag(); } holder.tvDramaName.setText(dramaList.get(position).getDramaName()); holder.cbCheck.setChecked(checks.get(position)); return row; }

notará en su logcat que inicialmente la vista de conversión es nula para todas las filas visibles, porque inicialmente no había vista (artículo) en la recicladora, entonces su getView () crea cada vista nueva para los artículos visibles, pero en el momento que despliega su artículo 1 se enviará al reciclador con su estado (por ejemplo, el texto de TextView y, como en el caso mío si la casilla de verificación está marcada, también se asociará con la vista y se almacenará en la recicladora). Ahora cuando se desplaza hacia arriba o hacia abajo su vista de lista no va a crear una nueva vista, usará la vista (vista de conversión) que ya está en su reciclador, en su Logcat notará que convertView no es nulo, es porque su nuevo elemento 8 se dibujarán utilizando convertview, es decir, básicamente toma la vista item1 de la recicladora y la infladora en lugar del item 8, y puede observar que como en el código de la mina si tenía una casilla de verificación y la marca en la posición 0 (let digamos item1 también tiene una casilla de verificación y la has marcado) así que cuando te desplaces hacia abajo verás que la casilla de verificación del elemento 8 ya está marcada, esta es la razón por la que listview usa la misma vista para no crear una nueva para ti debido a la optimización del rendimiento.

Cosas importantes

1 . Nunca configure el layout_height y el layout_width de su vista de wrap_content como wrap_content ya que getView() forzará a su adaptador a hacer que un niño mida el alto de las vistas que se dibujarán en la vista de lista y puede causar algún comportamiento inesperado, como devolver la conversión incluso la lista no match_parent use match_parent o ancho / alto fijo.

2 . Si desea utilizar algún Diseño o vista después de su vista de lista y la pregunta puede venir en su mente si configuro el layout_height para fill_parent la vista después de la vista de lista no se mostrará a medida que baja por la pantalla, así que es mejor poner su listview dentro de un diseño. Por ejemplo Diseño lineal y establezca el alto y el ancho de ese diseño a partir de su requerimiento y haga que el atributo alto y ancho de su vista de lista coincida con su diseño (como si su ancho de diseño es 320 y su altura es 280) su vista de lista debe tener la misma altura y ancho . Esto indicará a getView () la altura exacta y el ancho de las vistas a renderizar, y getView () no llamará una y otra vez algunas filas aleatorias, y otros problemas como devolver vista de conversión incluso antes de desplazarse no sucederán, tengo una prueba esto mismo, a menos que mi listview estuviera dentro de la linea. También estaba teniendo problemas como repetir view call y convertir ver como, poner Listview dentro de LinearLayout funcionaba como magia para mí. (no sabía por qué)

01-01 14:49:36.606: I/System.out(13871): getview 0 null 01-01 14:49:36.636: I/System.out(13871): getview 0 android.widget.RelativeLayout@406082c0 01-01 14:49:36.636: I/System.out(13871): getview 1 android.widget.RelativeLayout@406082c0 01-01 14:49:36.646: I/System.out(13871): getview 2 android.widget.RelativeLayout@406082c0 01-01 14:49:36.646: I/System.out(13871): getview 3 android.widget.RelativeLayout@406082c0 01-01 14:49:36.656: I/System.out(13871): getview 4 android.widget.RelativeLayout@406082c0 01-01 14:49:36.666: I/System.out(13871): getview 5 android.widget.RelativeLayout@406082c0 01-01 14:49:36.666: I/System.out(13871): getview 0 android.widget.RelativeLayout@406082c0 01-01 14:49:36.696: I/System.out(13871): getview 0 android.widget.RelativeLayout@406082c0 01-01 14:49:36.706: I/System.out(13871): getview 1 null 01-01 14:49:36.736: I/System.out(13871): getview 2 null 01-01 14:49:36.756: I/System.out(13871): getview 3 null 01-01 14:49:36.776: I/System.out(13871): getview 4 null

Pero ahora está resuelto, lo sé, no soy tan bueno para explicarlo, pero como puse todo mi día a entender, pensé que otros principiantes como yo pueden obtener ayuda de mi experiencia y espero que ahora ustedes tengan un poco de comprensión. de ListView framework cómo funciona, ya que es realmente complicado y complicado, por lo que los principiantes encontraron demasiado problema para entenderlo

Así que tengo este problema que tenía antes, y naturalmente pedí ayuda here . La respuesta de Luksprog fue excelente porque no tenía idea de cómo ListView y GridView se optimizaban con el reciclaje de vistas. Entonces, con su consejo, pude cambiar la forma en que agregué Views a mi GridView. El problema es que ahora tengo algo que no tiene sentido. Esta es mi getView de mi BaseAdapter :

public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); convertView = inflater.inflate(R.layout.day_view_item, parent, false); } Log.d("DayViewActivity", "Position is: "+position); ((TextView)convertView.findViewById(R.id.day_hour_side)).setText(array[position]); LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.day_event_layout); //layout.addView(new EventFrame(parent.getContext())); TextView create = new TextView(DayViewActivity.this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 62, getResources().getDisplayMetrics()), 1.0f); params.topMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); params.bottomMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); create.setLayoutParams(params); create.setBackgroundColor(Color.BLUE); create.setText("Test"); //the following is my original LinearLayout.LayoutParams for correctly setting the TextView Height //new LinearLayout.LayoutParams(0, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics()), 1.0f) if(position == 0) { Log.d("DayViewActivity", "This should only be running when position is 0. The position is: "+position); layout.addView(create); } return convertView; } }

El problema es cuando me desplazo, sucede esto, y no en la posición 0 ... Se ve como la posición 6 y la posición 8, además pone dos en la posición 8. Ahora todavía estoy tratando de aprender a usar ListView y GridView, así lo hago No entiendo por qué está sucediendo esto. Una de las razones principales por las que hago esta pregunta es para ayudar a otros que probablemente no conozcan la Vista de reciclado de ListView y GridView, o la forma en que lo describe este article , el mecanismo ScrapView.

Más tarde Editar

Agregar un enlace a una charla de Google IO que es básicamente todo lo que necesita para comprender cómo funciona ListView. Link estaba muerto en los comentarios. Entonces el usuario3427079 fue lo suficientemente bueno para actualizar ese enlace. Here es de fácil acceso.


Tenga cuidado, en el patrón de Holder, si establece la posición en su objeto Holder, debe configurarlo cada vez, por ejemplo:

@Override public final View getView(int position, View view, ViewGroup parent) { Holder holder = null; if (view == null) { LayoutInflater inflater = (LayoutInflater) App.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(getContainerView(), parent, false); holder = getHolder(position, view, parent); holder.setTag(tag); view.setTag(holder); } else { holder = (Holder) view.getTag(); } holder.position = position; draw(holder); return holder.getView(); }

este es un ejemplo de una clase abstracta, donde

getHolder(position, view, parent);

hace todas las operaciones de ajuste para el

ImageViews, TextViews, etc..


Usando el patrón Holder puede lograr lo que quiere:

Puede encontrar la descripción de este patrón aquí:

El reciclaje de la vista de lista ocurre cuando se desplaza hacia abajo en la pantalla y los elementos de la vista de lista superior están ocultos. Se reutilizan para mostrar nuevos elementos de vista de lista.