Para parte de mi aplicación, se le presenta al usuario una lista de nombres y se le pide que los agrupe como mejor le parezca.
(Tenga en cuenta que el código ListView se copió literalmente del tutorial de Vistas de Android. Todavía no lo he personalizado a mis necesidades, solo estoy tratando de descubrir cómo hacer que esto funcione).
El diseño básico es un LinearLayout, que contiene un ScrollView (llamado "groupsScrollView" en el código a continuación), que contiene un RelativeLayout. Tengo algunos botones y texto, y luego mi ListView debajo de eso, que muestra la lista de nombres. Todo esto es más alto que el área de pantalla visible, por lo que el usuario puede desplazarse verticalmente para verlo todo.
Todo esto funciona a la perfección, excepto cuando la página se carga, siempre se desplaza previamente a la parte superior de mi ListView, en el medio de la página. El texto y los botones que he creado que le dicen al usuario qué hacer no están visibles.
Puedo tomar la pantalla y desplazarme hacia arriba, eso funciona bien, pero me gustaría que la pantalla se cargue ya que se ha desplazado hacia la parte superior. El usuario no debería tener que desplazarse hacia ARRIBA para ver la parte superior de una página recién cargada. Pero todo lo que he intentado desplazar programáticamente a la parte superior de la pantalla ha fallado.
Aquí está mi método onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.groups);
mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);
//get the Bundle out of the Intent...
Bundle extras = getIntent().getExtras();
mNames = extras.getStringArray("mNames");
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
//This is the line I'm having issues with
mainScrollView.pageScroll(View.FOCUS_UP);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
La línea "mainScrollView.pageScroll (View.FOCUS_UP) es el problema. No causa un error, pero no parece hacer nada. He intentado scrollTo (0,0), scrollDirection (View.FOCUS_UP ), y todo lo demás que se me ocurre.
Como no recibo un error, debo suponer que estos comandos de desplazamiento funcionan realmente, pero que se desplazan hacia la parte superior de ListView, en lugar de la parte superior de ScrollView o RelativeLayout que lo contiene. Esto parece ser confirmado por la propia descripción de Google del método scrollTo (int x, int y) donde dicen "Esta versión también sujeta el desplazamiento a los límites de nuestro hijo".
Entonces, para hacer una pregunta larga aún más larga, ¿cómo cargo un montón de vistas en la pantalla contenida dentro de una Vista de desplazamiento y luego desplazo todo el programa por la parte superior de la página para que el usuario pueda interactuar con ella?
¡Gracias!
fuente
Tuve el mismo problema, probablemente algún tipo de error.
Incluso el
fullScroll(ScrollView.FOCUS_UP)
de la otra respuesta no funcionó.Lo único que funcionó para mí fue llamar
scroll_view.smoothScrollTo(0,0)
justo después de que se muestra el diálogo.fuente
fullScroll()
de que mantiene el elemento seleccionado aún seleccionado después del movimiento. ConfullScroll()
, el primer elemento en la vista de desplazamiento se volvió a seleccionar cada vez en mi caso, independientemente del elemento seleccionado antes de que el desplazamiento se moviera hacia arriba.Tuve el mismo problema y esto lo solucionó. Espero que te ayude.
fuente
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
esto funciona bien, pero solo el problema con esta línea es que, cuando los datos se llenan en scrollViewObject, se ha llamado de inmediato. Debe esperar algunos milisegundos hasta que se llenen los datos. Prueba este código:O
fuente
El principal problema de todas estas soluciones válidas es que está intentando subir el desplazamiento cuando aún no está dibujado en la pantalla.
Debe esperar hasta que la vista de desplazamiento esté en la pantalla, luego subirla con cualquiera de estas soluciones. Esta es una mejor solución que una demora posterior, porque no le importa el retraso.
fuente
onGlobalLayout
llamada al métodoscrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Muy fácil
fuente
onCreate()
.Enfrenté el mismo problema cuando uso Scrollview dentro de View Flipper o Dialog, ese caso
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
devuelve falso, por lo que ese casoscrollViewObject.smoothScrollTo(0, 0)
me funcionóScroll Focus Top
fuente
fuente
fuente
Esto me funcionó
fuente
Esto es forzar desplazamiento para scrollview :
fuente
fuente
Solucioné mi problema en Kotlin así:
fuente
fuente