Cuando se desplaza un listview con un adaptador personalizado demasiado rápido arriba y abajo, getView () comienza a comportarse de manera extraña. ¿Por qué?

Tengo un listview con un arrayadapter de encargo que maneja cerca de 15 secuencias. El estilo de cada fila alterna (entre etiquetas y valores para esas etiquetas; por ejemplo, la fila 1 podría ser "dirección de correo electrónico" y la fila 2 sería la dirección de correo electrónico real). Estoy cambiando el estilo de cada fila para alternar como esto en el método getView () del arrayadapter. Así que si el elemento en la posición actual es una etiqueta, cambiaré el estilo del estilo de fila predeterminado (que es lo que los valores se han aplicado a ellos). Cuando el listview se carga por primera vez, el estilo es perfecto y lo que quiero que sea. Si desplazo la lista lentamente hacia arriba o hacia abajo, se mantiene así. Sin embargo, si desplácese la lista rápidamente hacia arriba y hacia abajo, el estilo de las filas de valores comienza a cambiar a las etiquetas hasta que todas las filas tengan el estilo de una fila de etiquetas. ¿Alguien sabe por qué sucedería esto? He utilizado adaptadores personalizados en otras vistas en la aplicación sin problemas como este.

Editar: Se encontró que también cambia todas las filas al estilo de la etiqueta en los cambios de orientación vertical-> paisaje. No hace esto en el paisaje-> cambios del retrato. A continuación se muestra el adaptador que estoy usando. ¿Me estoy perdiendo de algo?

public class DetailsAdapter extends ArrayAdapter<String> { private TextView text = null; private String item = null; public DetailsAdapter(Context context, int resource, int textViewResourceId, String[] objects) { super(context, resource, textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { text = (TextView) super.getView(position, convertView, parent); item = getItem(position); if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { text.setBackgroundColor(0xFF575757); text.setTextSize(15); text.setTypeface(null, Typeface.BOLD); text.setPadding(8, 5, 0, 5); } else { text.setPadding(15, 15, 0, 15); } return text; } @Override public boolean isEnabled(int position) { item = getItem(position); if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { return false; } else { return true; } } } 

Android reutiliza las vistas de forma bastante agresiva y es muy posible que una vista que se utilizó como una fila de direcciones de correo electrónico se reutilice en una fila que se supone que muestra una etiqueta y viceversa.

Como resultado, no puede confiar en valores "predeterminados". Fije su relleno, tipo de letra, tamaño de texto y color de fondo en todos los casos:

 if (item.equals("Name") || item.equals("Mobile") || item.equals("Home") || item.equals("Email") || item.equals("Address")) { text.setBackgroundColor(0xFF575757); text.setTextSize(15); text.setTypeface(null, Typeface.BOLD); text.setPadding(8, 5, 0, 5); } else { text.setBackgroundColor(DEFAULT_BACKGROUND); text.setTextSize(DEFAULT_TEXT_SIZE); text.setTypeface(null, DEFAULT_TYPEFACE); text.setPadding(15, 15, 0, 15); } 

No necesitas hacer nada. Yo también enfrenté el mismo problema y lo resolví así:

Justo dentro del método getView agrega una primera línea

 convertView=null; 

No volverá a dibujar la vista inmediatamente destruida sino que creará nuevas cada vez basado en su lógica (incluso impar o lo que sea)

  • Cómo obtener todos los elementos seleccionados de un ListView?
  • Encabezados ListView sin separadores de elementos de lista
  • Configuración de la posición de desplazamiento de ListView bien en Android
  • Galería de imágenes de desplazamiento horizontal de Android
  • Listview Desplácese al final de la lista después de actualizar la lista
  • Filtrado de la vista de lista y obtención del elemento onclick correcto
  • Android RatingBar se pinta mal
  • ¿Cómo actualizar ListView en ListFragment de FragmentActivity?
  • Implementación de la atracción de Chris Banes para actualizar junto con desplazamiento horizontal en la vista de lista
  • Android listview semitransparente selección color de una fila
  • Deslizar para eliminar listview muestra artefactos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.