Android: cómo hacer scrollview infinito con desplazamiento sin fin
Quiero un código para que el ScrollView
muestre las mismas imágenes con desplazamiento sin fin una y otra vez.
Esto es excelente para el diseño y quiero saber cuál es el código necesario para añadirlo a un ScrollView
con desplazamiento infinito.
- Artículo Sticky ScrollView en la parte inferior - Android
- ScrollView no cambia de tamaño directamente después de cambios secundarios
- Android ScrollView isFinished?
- Android ScrollView se niega a desplazarse hasta la parte inferior
- ScrollView con botones en el interior, sin respuesta hasta el segundo clic en cualquier botón dentro
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <HorizontalScrollView android:id="@+id/horizontalScrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> </LinearLayout> </HorizontalScrollView>
- Espacio en blanco se agrega al final cuando pongo Webview dentro de scrollview en android
- Lista expandible dentro de scrollview
- Comprobar si un androide scrollview puede desplazarse
- Css + Android - no hay respuesta de clic en scrollable / Lista de vista
- Barra de botones inferior de Android y vista de desplazamiento con tema de diálogo
- El teclado suave no activa el desplazamiento en un ScrollView
- Instagram como desplazamiento en la galería personalizada
- EditText, adjustPan, ScrollView problema en android
Utilice un ListView
y un Adapter
que se modifica ligeramente para tener elementos "infinitos"
Aquí están los cambios a su Adapter
que apoyaría este comportamiento:
@Override public int getCount() { return Integer.MAX_VALUE; } @Override public ImageItem getItem(int position) { return mItems.get(position % mItems.size()); }
Esencialmente usted lo MAX_INT
diciéndole que la cuenta es MAX_INT
y entonces cuando usted va para conseguir un artículo mod del uso para conseguir el artículo correcto en la secuencia.
Varias personas han propuesto diferentes soluciones a este ya así.
Vea aquí: Lista sin fin de Android
Y CommonsWare tiene un componente que también admite este comportamiento: https://github.com/commonsguy/cwac-endless
La respuesta de FoamGuy es correcta. Pero para hacer que la lista retroceda, como en un carrusel infinito, también truco al sistema estableciendo el elemento predeterminado como Integer.MAX_VALUE / 2 llamando a:
listView.setSelection( Integer.MAX_VALUE/2 );
Es bastante improbable que el usuario retroceda 1 mil millones de elementos atrás, lo que hace que el efecto del carrusel infinito en ambas direcciones.
También tengo algunas otras modificaciones a la implementación personalizada de BaseAdapter:
@Override public Object getItem(int position) { if ( model.getSize()==0 ) { return null; } // mod the list index to the actual element count return model.getElementAtPosition( position%model.getSize() ); } @Override public long getItemId(int position) { if ( model.getSize()==0 ) { return -1; } // same as above return model.getElementAtPosition( position%model.getSize() ).id; } @Override public View getView(int position, View convertView, ViewGroup parent) { if ( model.getSize()==0 ) { return null; } // also make sure to point to the appropriate element in your model otherwise you // would end up building millions of views. position%=model.getSize(); View front= convertView; if ( convertView==null ) { // inflate/build your list item view } ... }
De esta manera la lista girará como en un carrusel sin asignación de memoria adicional para vistas innecesarias.