2011-06-09 10 views
8

Tengo un Android ListView que tiene tartamudeos pequeños (por ejemplo, 1-5 cuadros) mientras se desplaza, aproximadamente cada segundo. Me doy cuenta de que muchos teléfonos Android tienen estos problemas con la suavidad de la animación, sin embargo, en mi teléfono (Motorola A855 con Android 2.2), la lista de contactos nativos se desplaza sin problemas. La vista de un elemento en la lista de contactos es más compleja que la vista del elemento en mi lista, que es:Mejorando suavidad de desplazamiento en un ListView de Android

<RelativeLayout> 
    <TextView /> 
    <TextView /> 
</RelativeLayout> 

Yo sólo quiero lograr suavidad tan buena como la lista de contactos nativa. Parece que esto debería ser posible sin optimizar el código nativo, pero tal vez estoy equivocado al respecto.

He intentado algunas cosas: simplifiqué aún más la vista de elementos, e intenté crear instancias programáticamente en lugar de en XML. También he intentado cambiar mi forma de reaccionar a los eventos de clic elemento, según este enlace:

http://groups.google.com/group/android-developers/browse_thread/thread/7dc261a6b382ea74?pli=1

Ninguna de estas cosas parecen tener ningún efecto sobre el rendimiento.

¿Hay algo que pueda hacer en mi aplicación para mejorar el rendimiento? Estoy buscando implementar esta aplicación en varios teléfonos, por lo que cambiar mi configuración en el teléfono o rootear el dispositivo no es una opción en mi caso. Aquí está el método getView de mi clase de adaptador:

public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater flater = (LayoutInflater)context.getSystemService(ListActivity.LAYOUT_INFLATER_SERVICE); 
     layout = flater.inflate(R.layout.song_view, parent, false); 
     TextView first = (TextView)layout.findViewById(R.id.firstLine); 
     TextView second = (TextView)layout.findViewById(R.id.secondLine); 

     Thing t = array.get(position); 
     first.setText(t.title); 
     second.setText(t.name); 
     return layout; 
    } 

¡Gracias de antemano!

+0

proporcionar información acerca de su adaptador – Selvin

+0

Se supone que * al menos lea la guía oficial de Android. Se llama patrón de Viewholder. – Singgum3b

Respuesta

6

Es difícil saber por qué esto puede estar sucediendo sin ver su código.

Sin embargo, un lugar para buscar es su método getView() en su ListAdapter (suponiendo que esté usando un adaptador personalizado). Intente y reutilice la Vista que se pasa como argumento a este método en lugar de crear una nueva cada vez. Además, no haga nada demasiado pesado en este método (por ejemplo, una llamada de red), de hecho trate de hacerlo lo más delicado y mezquino posible para obtener el mejor rendimiento.

+2

"Prueba y vuelve a utilizar la vista que se pasa como argumento para este método en lugar de crear uno nuevo cada vez". Este resultó ser exactamente el problema. Espero que esto ayude a otras personas que piensan que el parámetro convertView es solo por conveniencia. He agregado mi código original roto a la pregunta para que la gente pueda ver mi error. Mark Allison, eres un dios informático (extraño, terrible). – charleslparker

+0

¿Qué tal si uso el 'SimpleCursorAdapter' con el segundo constructor no desaprobado? ¿Debo extenderlo o debería hacerlo de la caja? – theblang

+0

Utilizará reciclar las vistas automáticamente. Si reemplaza a getView() tendrá que manejar el reciclaje de la vista. –

3

Did se trató adaptador eficiente http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

Desde mi punto de vista, el problema de la suavidad de la animación se debe al recolector de basura se ejecuta en segundo plano. Si está creando un montón de objetos, verá desfase en la vista de lista desplazarse.

Espero que esta ayuda.

+0

El enlace original está en desuso, pruebe este: http://www.linuxtopia.org/online_books/android/devguide/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.html – Brett

Cuestiones relacionadas