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?
- Deshacerse de overdraw en un ListView con fondos por elemento
- Stick Android ListView "categorías" para arriba
- ListView.addFooterView () no funciona si no hay elementos en listview
- Android ListView automáticamente Carga más datos cuando se desplaza a la parte superior
- ¿Cómo hacer que el desplazamiento de Listview sea más lento?
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 ListView adaptador con dos ArrayLists
- Diferencia en listview.setOnItemClickListener y row.setOnClickListener
- ¿Por qué getView devuelve objetos convertView incorrectos en SeparatedListAdapter?
- ¿Cómo puedo tener un ListView dentro de un NestedScrollView
- Android BaseAdapter con Fragmento
- ¿Cómo puedo replicar este patrón de interfaz de usuario: haga clic en el elemento ListView y expanda debajo de él?
- Visualización dinámica de imágenes del recurso / dibujable
- OnItemClickListener con adaptador personalizado y listview
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)
- Back y Nav Up tienen resultados diferentes
- Android Studio: instala la aplicación de lanzamiento por línea de comandos