studio programacion herramientas fundamentos con avanzado aplicaciones android listview scrollview

android - programacion - ¿Cómo desplazarse hasta la parte superior del diseño largo de ScrollView?



manual de android en pdf (13)

Muy fácil

ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll); scroll.setFocusableInTouchMode(true); scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

Para una 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ó textualmente del tutorial de Android Views. Todavía no lo he personalizado según mis necesidades, solo estoy tratando de descubrir cómo hacerlo funcionar).

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 la pantalla visible, por lo que el usuario puede desplazarse verticalmente para verlo todo.

Todo esto funciona muy bien, 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 son visibles.

Puedo tomar la pantalla y desplazarme hacia arriba, eso funciona bien, pero me gustaría que la pantalla se cargue y ya se haya 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 desplazarme 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 parece que no hace nada. He intentado con scrollTo (0,0), scrollDirection (View.FOCUS_UP) ), y todo lo demás que se me ocurre.

Como no aparece un error, debo suponer que estos comandos de desplazamiento funcionan realmente, pero que se desplazan hacia la parte superior de ListView, en lugar de hacia 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 bloquea el desplazamiento hasta los límites de nuestro hijo".

Entonces, para hacer una pregunta larga por más tiempo, ¿cómo puedo cargar un montón de vistas en la pantalla contenida dentro de un ScrollView, y luego desplazarme por programación todo al principio de la página para que el usuario pueda interactuar con ella?

¡Gracias!


El problema principal de todas estas soluciones válidas es que está intentando avanzar en el desplazamiento cuando todavía no está dibujado en la pantalla.

Debe esperar hasta que aparezca la vista de desplazamiento en pantalla, luego muévala hacia arriba con cualquiera de estas soluciones. Esta es una mejor solución que una postdelay, porque no te importa la demora.

// Wait until my scrollView is ready scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Ready, move up scrollView.fullScroll(View.FOCUS_UP); } });


Esto es forzar scroll para scrollview :

scrollView.post(new Runnable() { @Override public void run() { scrollView.scrollTo(0, 0); scrollView.pageScroll(View.FOCUS_UP); scrollView.smoothScrollTo(0,0); } });


Esto me funciona

scroll_view.smoothScrollTo(0,0); // scroll to top of screen


Me enfrenté al mismo problema cuando estoy usando Scrollview dentro de View Flipper o Dialog que el caso scrollViewObject.fullScroll(ScrollView.FOCUS_UP) devuelve falso para que el caso scrollViewObject.smoothScrollTo(0, 0) para mí

Desplazar el foco arriba


Tenía 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 a scroll_view.smoothScrollTo(0,0) justo después de que se muestra el cuadro de diálogo.


Tratar

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

deberia de funcionar.


Tuve el mismo problema y esto lo solucionó. Espero que te ayude

listView.setFocusable(false);


scrollViewObject.fullScroll(ScrollView.FOCUS_UP) funciona bien, pero solo el problema con esta línea es que, cuando los datos se rellenan en scrollViewObject, usted llama inmediatamente. Tienes que esperar algunos milisegundos hasta que se llenen los datos. Prueba este código:

scrollViewObject.postDelayed(new Runnable() { @Override public void run() { scroll.fullScroll(ScrollView.FOCUS_UP); } }, 600);

O

scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListene‌​r(this); scrollViewObject.fullScroll(View.FOCUS_UP); } });


final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview); scrollview.post(new Runnable() { public void run() { scrollview.scrollTo(0, 0); } });


@SuppressWarnings({ "deprecation", "unchecked" }) public void swipeTopToBottom(AppiumDriver<MobileElement> driver) throws InterruptedException { Dimension dimensions = driver.manage().window().getSize(); Double screenHeightStart = dimensions.getHeight() * 0.30; int scrollStart = screenHeightStart.intValue(); System.out.println("s="+scrollStart); Double screenHeightEnd = dimensions.getHeight()*0.90; int scrollEnd = screenHeightEnd.intValue(); driver.swipe(0,scrollStart,0,scrollEnd,2000); CommonUtils.threadWait(driver, 3000); }


runOnUiThread( new Runnable(){ @Override public void run(){ mainScrollView.fullScroll(ScrollView.FOCUS_UP); } }


scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Ready, move up scrollView.fullScroll(View.FOCUS_UP); } });