Android ListView scrollTo
-
28-09-2019 - |
Pregunta
Tengo un LinearLayout
que contiene algunos otros puntos de vista y entre los que un ListView
.
Este punto de vista se carga desde otro haciendo clic en un botón.
Este botón alguna manera especifica qué elemento en el ListView tiene que ser el primero visible en la lista. Los elementos que rellena la lista se recuperan a través de HTTP desde un servidor externo.
El problema es que puedo conseguir el enésimo elemento para ser el primero en la lista. Tenga en cuenta, no quiero para moverlo forma que la posición actual a uno nuevo, quiero a la lista de desplazamiento.
He tratado con setSelected()
y scrollTo(x,y)
y scrollBy(x,y)
pero sin suerte.
También he dado una oportunidad a este pice de código, tan feo como es, pero yo sólo quería probar que estaba trabajando f:
ListView categoryList = (ListView)findViewById(R.id.category_list);
categoryList.post(new Runnable() {
@Override
public void run() {
Log.d(this.getClass().getName(), "CategoryActivity.scrollToIndex: " + CategoryActivity.scrollToIndex);
if(CategoryActivity.scrollToIndex>0){
ListView categoryList = (ListView)findViewById(R.id.category_list);
categoryList.setScrollContainer(true);
categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
categoryList.requestLayout();
}
}
});
Y esto me dio un poco de éxito, pero entonces el ListView se comportaba loco de una manera que ni siquiera soy capaz de describir ....
¿Alguna idea?
Solución
Trate de añadirlo a la cola de mensajes
categoryList.post(new Runnable() {
public void run() {
categoryList.scrollTo(4, CategoryActivity.scrollToIndex * 50);
}
});
Se trabajó para mí en un ScrollView ( comprobar esta respuesta ).
Otros consejos
i hecho funciones que podrían ser útiles para otros por desplazamiento vista de lista, que trabajan para mí en todas las versiones de Android, emulador y el dispositivo, aquí ItemHeight es la altura fija de vista en la vista de lista.
int itemheight=60;
public void scrollToY(int position)
{
int item=(int)Math.floor(position/itemheight);
int scroll=(int) ((item*itemheight)-position);
this.setSelectionFromTop(item, scroll);// Important
}
public void scrollByY(int position)
{
position+=getListScrollY();
int item=(int)Math.floor(position/itemheight);
int scroll=(int) ((item*itemheight)-position);
this.setSelectionFromTop(item, scroll);// Important
}
public int getListScrollY()
{
try{
//int tempscroll=this.getFirstVisiblePosition()*itemheight;// Important
View v=this.getChildAt(0);
int tempscroll=(this.getFirstVisiblePosition()*itemheight)-v.getTop();// Important
return tempscroll;
}catch(Exception e){}
return 0;
}