Adaptador de Android múltiple getView

He leído sobre el tema de getView llamado varias veces y todas las respuestas. Sin embargo, no encuentro una solución para mi problema.

Tengo una lista donde las filas tienen dos estados: lea o no. Bueno, quiero que los elementos vistos por primera vez tienen un color diferente y cuando hago la lista, cambian su color a "estado de lectura".

Para ello, en el método getView de mi adaptador establezco un campo isRead cuando se pinta la fila para ese elemento. Pero el problema es el siguiente: dado que el método getView se llama varias veces el campo está marcado como leído y cuando la lista se muestra en la pantalla aparece como si ya se hubiera leído.

¿Alguna idea para solucionar este problema?

Gracias

Supongo que quiere decir el problema de getView que solicita la misma vista varias veces.

ListView hace esto porque necesita obtener mediciones para las vistas por diferentes razones (tamaño de la barra de desplazamiento, diseño, etc.)

Este problema generalmente se puede evitar al no usar la propiedad "wrap_content" en su listview.

Aparte de eso, usar getView para determinar si una vista se ha mostrado es simplemente una mala idea. ListView tiene muchas optimizaciones que desorden con el orden getView se llama para cada fila, por lo que no hay manera de saber qué pasará y su aplicación comenzará a mostrar un comportamiento extraño.

Trate de evitar cualquier relación entre la vista y los datos distintos del concepto de vista como una visualización de esos datos.

En su lugar, tenga un hilo de trabajo o un oyente de eventos en su listactivity, observe la lista para la que los elementos de la lista se han mostrado al usuario, actualice los datos y llame a dataSetChanged en su adaptador.

Tuve el mismo problema y no tenía ninguna referencia en absoluto a "wrap_content" en el layouts attirbute. Aunque este es un viejo hilo no pude averiguar cómo resolver el problema. Por lo tanto, mitigado por la adición de una lista en el adaptador que contiene las posiciones ya dibujado, como se muestra en el código de abajo. Creo que no es el derecho de hacer eso, pero funcionó para mí.

public class ImageAdapter extends BaseAdapter { private Context mContext; private List<Integer> usedPositions = new ArrayList<Integer>(); public ImageAdapter(Context c, List<String> imageUrls) { mContext = c; ... } ... // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else { imageView = (ImageView) convertView; } if (!usedPositions.contains(position)) { // Your code to fill the imageView object content usedPositions.add(position); // holds the used position } return imageView; } } 

No es la forma en que quieres que funcione. La razón por la que getView() se denomina varias veces es permitir que el sistema operativo mida las filas para que sepa cómo distribuirlas. Usted tendría que tener marcado como leído cuando hacen clic en él o marcar una casilla o algo.

Aquí está una manera muy simple de evitar la llamada doble cuando usted sabe nada debajo de este bloque de código distorsionará el diseño.

 private static List<String> usedPositions = new ArrayList<String>(); 

 @Override public View getView(int position, View rowView, ViewGroup parent) { rowView = inflater.inflate(R.layout.download_listview_item, null); Log.d(LOG_TAG, "--> Position: " + position); if (!usedPositions.contains(String.valueOf(position))){ usedPositions.add(String.valueOf(position)); return rowView; }else{ usedPositions.remove(String.valueOf(position)); } 

  • Android: casillas de verificación en un ListView (comportamiento extraño del elemento seleccionado)
  • ¿Es Android BaseAdapter un ejemplo de patrón de adaptador?
  • ¿Quieres implementar notifyDataSetChanged o autorefresh a mi RecyclerView pero no funciona
  • Cómo saber qué vista dentro de un elemento ListView específico al que se hizo clic
  • Adaptador de ListView personalizado lanza UnsupportedOperationException
  • Cambio de intervalo de sincronización de cuenta de Android en las preferencias
  • Eliminar elemento de GridView
  • Texto sobrepuesto de Android en el adaptador
  • Enumera el alineamiento de elementos con Recycler View
  • RecyclerView Varias vistas de disposición en una clase de adaptador
  • ViewHolder no como una clase interna
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.