Android: как сделать бесконечное прокручивание с бесконечной прокруткой

Я хочу, чтобы код, чтобы ScrollView показывал одни и те же изображения с бесконечной прокруткой снова и снова.

Это отлично подходит для макета, и я хочу знать, что такое код, необходимый для добавления его в ScrollView с бесконечной прокруткой.

 <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> 

Используйте ListView и Adapter который слегка модифицирован, чтобы иметь «бесконечные» элементы

Вот изменения вашего Adapter которые будут поддерживать это поведение:

 @Override public int getCount() { return Integer.MAX_VALUE; } @Override public ImageItem getItem(int position) { return mItems.get(position % mItems.size()); } 

По сути, вы обманываете его, сообщая ему, что счетчик MAX_INT а затем, когда вы идете, чтобы получить MAX_INT использования элемента, чтобы получить правильный элемент в последовательности.

Несколько человек предложили и другие решения для этого.

Смотрите здесь: Android Endless List

И CommonsWare имеет компонент, который также поддерживает это поведение: https://github.com/commonsguy/cwac-endless

Ответ FoamGuy верен. Но чтобы сделать список в обратном направлении, как в бесконечной карусели, я также обманываю систему, установив элемент по умолчанию Integer.MAX_VALUE / 2, вызывая:

 listView.setSelection( Integer.MAX_VALUE/2 ); 

Очень маловероятно, что пользователь вернет обратно 1 миллиард элементов назад, что делает эффект бесконечной карусели в обоих направлениях.

У меня также есть некоторые другие изменения в пользовательской реализации 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 } ... } 

Таким образом, список будет вращаться, как в карусели без дополнительного распределения памяти для ненужных представлений.