2011-09-29 26 views
47

Tengo un ListView al que llamo smoothScrollBy() en. El 95% del tiempo, el smoothScrollTo() se comporta como se esperaba. Sin embargo, hay momentos en que no termina en el lugar deseado. He verificado que le estoy dando el mismo valor. Observé que el desplazamiento suave no es tan fluido cuando se cometen los errores, sin embargo, no hay otras tareas que realice mi aplicación sobre las que tendría control.Android smoothScrollBy se comporta mal

No estoy muy seguro de lo que está sucediendo en el fondo, pero un posible culpable es la recolección de basura.

El 95% de precisión no es suficiente en esta situación. Tendré que implementar algún tipo de mecanismo de corrección para asegurarme de que el ListView aterrice en el lugar correcto en estos casos.

¿Existe alguna otra forma mejor de usar smoothScrollBy() que no sea simplemente llamar al view.smoothScrollBy(distance, time);?

+0

¿Alguna vez encontró una buena resolución para esto? Ahora estoy exactamente en la misma posición, donde simplemente tengo que tener el 100% de precisión para 'smoothScrollBy()', pero su operación real es muy inconsistente. – Trevor

+2

Sí, terminé abandonando ListView para tener más control sobre la posición usando ScrollView y simplemente agregando vistas secundarias a ella. Antes de darme cuenta de esto, estaba usando un mecanismo de corrección que aseguraría que se desplazara al lugar correcto, y el iniciado otro rollo si no. Muy impreciso y no aceptable para aplicaciones profesionales :( – styler1972

+5

Muchas gracias, Styler. Hoy traté de implementar un mecanismo de corrección que básicamente aplica múltiples pergaminos de forma iterativa, con sucesivos pergaminos invocados (a través de un 'Manejador') desde un 'OnScrollListener() '.Estoy sorprendido de decir que el resultado final es extremadamente bueno. Lo que hice fue hacer que la mayor parte del desplazamiento ocurriera muy rápido, pero el desplazamiento final sobre los 500px finales es lento (400ms). Esto hace que todo el desplazamiento se vea muy Fluido y agradable, más bien como un solo rollo no lineal. Tendré que tratar de encontrar un tiempo para poner un ejemplo y publicarlo aquí. – Trevor

Respuesta

6

probar algunos de estos:

Listview tiene su propio mecanismo de desplazamiento. Se desplaza cuando se agrega el contenido.

  1. altura listview Assign (android: layout_height) para match_parent o fill_parent.

  2. Si asigna un adaptador en un hilo de trabajo. No realice ninguna acción de IU en el hilo.

Si esto no resuelve el problema. Por favor, publique el código donde asigna el adaptador a la vista de lista, si corresponde. O el código relevante.

También el código de diseño xml.

Espero que esto ayude.

5

a veces será debido al problema de temporización. Cuando los puntos de vista se agregan a la vista de lista y el tiempo que hace

view.smoothScrollBy(distance, time); 

la vista de lista o de la interfaz de usuario todavía no necesitan refrescarse. Así que haz esto en el subproceso de visitas con un retraso específico. P.ej.

view.postDelayed(new Runnable{ 
    view.smoothScrollBy(distance, time); 
},1000); 
+0

Parece que debería funcionar. ¿Lo hizo? ¿Nadie? –

+0

No creo que esto sea lo suficientemente fluido ... esto significa que debe esperar 1 segundo para poder iniciar un desplazamiento. eso sería un show stopper con la aplicación que estaba usando esto en – styler1972

+1

que la demora de 1 segundo es solo un ejemplo ... verifica cuánto tiempo necesita para que tus vistas se actualicen y luego agrega esa demora. No necesita ser un segundo. puede b incluso en milisegundos en su caso. – amandroid

Cuestiones relacionadas