2010-08-04 17 views
5

Tengo una vista de lista con un arrayadapter personalizado que maneja aproximadamente 15 cadenas. El estilo de cada fila se 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 de esta manera en el método getView() de arrayadapter. Entonces, 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 les han aplicado). Cuando la vista de lista se carga por primera vez, el diseño es perfecto y justo como quiero que sea. Si me desplazo lentamente hacia arriba o hacia abajo en la lista, sigue siendo así. Sin embargo, si desplazo rápidamente la lista hacia arriba y hacia abajo, el diseño de las filas de valores comienza a cambiar a la de las etiquetas hasta que todas las filas tengan el estilo de una fila de etiquetas. ¿Alguien sabe por qué esto estaría sucediendo? Utilicé adaptadores personalizados en otras listas de la aplicación sin problemas como este.Cuando desplazo una vista de lista con un adaptador personalizado demasiado rápido hacia arriba y hacia abajo, getView() comienza a comportarse de manera extraña. ¿Por qué?

Editar: Descubrí que también cambia todas las filas del estilo de la etiqueta en los cambios de orientación vertical-> horizontal. No hace esto en los cambios de paisaje-> retrato. Debajo está 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; 
    } 
} 
} 
+0

¿Puedes mostrar tu código getView? –

+0

Inicialmente, cuántas filas se presentarán cuando se cargue listview. Crear una vista para una fila usando el método getview de customadapter es una tarea que requiere mucha memoria. Esta es la razón de la representación desordenada de sus etiquetas. Escriba destellos de su código ... Podría ser que obtenga una solución –

Respuesta

7

Android reutiliza vistas bastante agresiva, y es muy posible que un punto de vista que se utilizó como una fila dirección de correo electrónico se reutiliza en una fila que se supone que exhibir una etiqueta, y viceversa.

Como resultado, no puede confiar en los valores "predeterminados". Establezca 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); 
} 
+0

Eso funcionó - gracias. No sé por qué no lo intenté ... – oliverwhite

+0

"Agresivo" es un término preciso, ¡diría yo! Recientemente, este error me ha picado, lo que yo llamaría, en Android. Tiene sentido para ellos reutilizar la vista que sale de la pantalla como una vista que aparecerá en la pantalla, pero no se puede esperar que un desarrollador que ha reformateado filas en getView() lo sepa. Sin embargo, quizás ArrayAdapter o SimpleAdapter no estaban destinados para eso. – electromaggot

+1

¡Entonces +1 en el comentario de Marius! Una cosa que sugeriría es hacer que los métodos "saveFormat()" y "restoreFormat()" retengan los valores iniciales de la fila (los "valores predeterminados" a los que se refiere Marius). Esto facilitará el mantenimiento futuro, ya que el formato de la fila siempre estará predeterminado en un lugar en el XML. – electromaggot

4

No es necesario hacer nada. Yo también se enfrentó al mismo problema y lo resolvió así:

Justo en el método getView añadir una primera línea

convertView=null; 

No lo puedo volver a dibujar la vista destruido inmediatamente, sino que crearía nuevos cada horaria en función de lógica (incluso impar o lo que sea)

+0

Esto resolvió el problema para mí, pero hizo que la lista fuera increíblemente lenta. –

+0

Me parece que esta debería ser la respuesta correcta. El mío no se quedó atrás (aunque no es realmente tan complicado). –

Cuestiones relacionadas