Infinite Scrolling Image ViewPager

Según lo documentado por Google, la clase Galería estaba obsoleta en el nivel 16 de la API. Este widget ya no es compatible. Otros widgets de desplazamiento horizontal incluyen HorizontalScrollView y ViewPager de la biblioteca de soporte. Así que utilicé ViewPager como una alternativa a la clase Gallery.

Mi objetivo es lograr finalmente una imagen de desplazamiento infinita ViewPager con descripciones de texto . He utilizado el siguiente código para lograr la imagen ViewPager con el texto que describe cada imagen, pero ¿cómo puedo aplicar el desplazamiento infinito a un ViewPager?

No he trabajado con ViewPager antes, así que trate de proporcionar un código detallado si es posible.

Activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/myimagepager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

Custom_pager.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal"> <ImageView android:id="@+id/myimage" android:layout_width="match_parent" android:layout_height="0dp" android:layout_margin="5dp" android:layout_weight="2" /> <TextView android:id="@+id/image_text" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout> 

ImagePager:

 public class ImagePager extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra, stringArray ); ViewPager myPager = (ViewPager) findViewById(R.id.myimagepager); myPager.setAdapter(adapter); myPager.setCurrentItem(0); } private int imageArra[] = { R.drawable.a, R.drawable.b,R.drawable.c, R.drawable.d,R.drawable.e,R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.i}; private String[] stringArray = new String[] { "Image a", "Image b","Image c" "Image d","Image e","Image f", "Image g","Image h","Image i"}; } 

ImagePagerAdapter:

 public class ImagePagerAdapter extends PagerAdapter { Activity activity; int imageArray[]; String[] stringArray; public ImagePagerAdapter(Activity act, int[] imgArra, String[] stringArra) { imageArray = imgArra; activity = act; stringArray = stringArra; } public int getCount() { return imageArray.length; } public Object instantiateItem(View collection, int position) { LayoutInflater inflater = (LayoutInflater)collection.getContext ().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.custom_pager, null); ImageView im=(ImageView) layout.findViewById(R.id.myimage); im.setImageResource(imageArray[position]); TextView txt=(TextView) layout.findViewById(R.id.image_text); txt.setText(stringArray[position]); ((ViewPager) collection).addView(layout, 0); return layout; } @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager) arg0).removeView((View) arg2); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == ((View) arg1); } @Override public Parcelable saveState() { return null; } } 

Tuve el mismo problema , pero pude encontrar una forma de resolverlo – el código se puede encontrar en github .

Si copia las clases InfiniteViewPager y InfinitePagerAdapter en su proyecto, puede lograr un desplazamiento infinito (envuelto) con algunos pequeños cambios.

En su actividad, envuelva su PagerAdapter con un InfinitePagerAdapter :

 PagerAdapter adapter = new InfinitePagerAdapter(new ImagePagerAdapter(this, imageArra, stringArray)); 

Cambie el ViewPager en el XML de la actividad para ser un InfiniteViewPager :

 <com.antonyt.infiniteviewpager.InfiniteViewPager android:id="@+id/myimagepager" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Puedes cambiar el nombre de las clases a lo que quieras. Este código sólo funciona si tiene al menos tres páginas (tiene nueve en su código de ejemplo, por lo que funcionará bien para eso).

Ya he encontrado una manera de hacer truco simple, espero que le ayuda a usted

 import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; public class ImagePager extends Activity { String[] stringArray; int[] imageArra; ViewPager myPager; Boolean isScrooled = false; // use this array yo understand swipe left or right ? ArrayList<Float> pos = new ArrayList<Float>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // put empty view at the beginnig and to end imageArra = new int[] { 0, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, 0 }; // put empty string at the beginnig and to end stringArray = new String[] { "", "Image a", "Image b", "Image c", "Image d", "Image e", "Image f", "Image g", "Image h", "Image i", "" }; ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra, stringArray); myPager = (ViewPager) findViewById(R.id.myimagepager); myPager.setAdapter(adapter); myPager.setCurrentItem(1); myPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { Log.v("onPageSelected", String.valueOf(arg0)); pos.clear(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { try { // while scrolling i add ever pos to array pos.add(arg1); // if pos.get(0) > pos.get(pos.size() - 1) // <----- swipe <----- // we should check isScroll because setCurrent item is not a croll ? if (pos.size() > 0) if (arg0 == imageArra.length - 1 & pos.get(0) > pos.get(pos.size() - 1) & isScrooled == true) { try { isScrooled = false; myPager.setCurrentItem(1, false); } catch (Exception e) { Log.v("hata", "<----- swipe <----- " + e.toString()); } } // ----> swipe ----> else if (arg0 == 0 & pos.get(0) < pos.get(pos.size() - 1) & isScrooled == true) { try { isScrooled = false; myPager.setCurrentItem(imageArra.length - 1, false); } catch (Exception e) { Log.v("hata", "----> swipe ----> " + e.toString()); } } else if (arg0 == 0 & pos.size() == 1 & isScrooled == true) { try { isScrooled = false; myPager.setCurrentItem(imageArra.length - 1, false); } catch (Exception e) { Log.v("hata", "----> swipe ----> " + e.toString()); } } } catch (Exception e) { Log.v("hata", e.toString()); } } @Override public void onPageScrollStateChanged(int arg0) { Log.v("onPageScrollStateChanged", String.valueOf(arg0)); // set is scrolling isScrooled = true; } }); } } 

[EDIT 1]

 import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; public class ImagePager extends Activity { String[] stringArray; int[] imageArra; ViewPager myPager; int scrollState; Boolean isFirstVisitEnd= true,isFirstVisitBegin = true; ArrayList<Integer> pos = new ArrayList<Integer>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageArra = new int[] { 0,R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, 0 }; stringArray = new String[] {"","Image a", "Image b", "Image c", "Image d", "Image e", "Image f", "Image g", "Image h", "Image i", "" }; ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra, stringArray); myPager = (ViewPager) findViewById(R.id.myimagepager); myPager.setAdapter(adapter); myPager.setCurrentItem(1); myPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { Log.v("onPageSelected", String.valueOf(arg0)); pos.clear(); if (arg0 == imageArra.length - 1) isFirstVisitEnd = false; else isFirstVisitEnd = true; if (arg0 == 0) isFirstVisitBegin = false; else isFirstVisitBegin = true; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { try { pos.add(Integer.valueOf(arg2)); if (pos.size() > 0) { //Log.v("onPageScrolled_arg2","arg0 : "+String.valueOf(arg0)+" ilk : "+pos.get(0).toString()+" son : " +pos.get(pos.size() - 1).toString()+ " "+ String.valueOf(pos.get(0)-(pos.get(pos.size() - 1)))+" isFirstVisitEnd: "+String.valueOf(isFirstVisitEnd.booleanValue()) ); // <----- swipe <----- if (arg0 == imageArra.length - 2& (pos.get(pos.size() - 1) -pos.get(0) < 100)& scrollState == 2 & isFirstVisitEnd == false) { myPager.setCurrentItem(1, false); } //Log.v("onPageScrolled_arg2","arg0 : "+String.valueOf(arg0)+" ilk : "+pos.get(0).toString()+" son : " +pos.get(pos.size() - 1).toString()+ " "+ String.valueOf(pos.get(0)-(pos.get(pos.size() - 1)))+" isFirstVisitbegin: "+String.valueOf(isFirstVisitBegin.booleanValue()) ); if (arg0 == 0 & (pos.get(pos.size() - 1) -pos.get(0) > -100)& scrollState == 2 & isFirstVisitBegin == false) { myPager.setCurrentItem(imageArra.length - 2, false); } } } catch (Exception e) { Log.v("hata", e.toString()); } } @Override public void onPageScrollStateChanged(int arg0) { Log.v("onPageScrollStateChanged", String.valueOf(arg0)); scrollState =arg0; } }); } } 

Creo que mi solución es más simple.

Atención a mi matriz de estructura de imágenes:

 Item 0 => last image Item count()-1 => first image 

El truco está en onPageScrollStateChanged :

Cuando el usuario se desplaza al último elemento -> el buscapersonas salta sin animación a la primera imagen (posición = 1)

Cuando el usuario se desplaza al primer elemento -> el paginador salta sin animación a la última imagen (position = count – 2)

 public class InfiniteScrollingActivity extends ActionBarActivity { private ViewPager pager; private MyAdapter adapter; int[] promoImageIds = new int[]{R.drawable.cover6, R.drawable.cover1, R.drawable.cover2, R.drawable.cover3, R.drawable.cover4, R.drawable.cover5, R.drawable.cover6, R.drawable.cover1 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_test); adapter = new MyAdapter(getSupportFragmentManager(), promoImageIds); pager = (ViewPager)findViewById(R.id.pager); pager.setAdapter(adapter); pager.setCurrentItem( 1 ); pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int index) { Log.v( "onPageSelected", String.valueOf( index ) ); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // Log.v("onPageScrolled", ""); } @Override public void onPageScrollStateChanged(int state) { Log.v("onPageScrollStateChanged", String.valueOf(state)); if (state ==ViewPager.SCROLL_STATE_IDLE) { int index = pager.getCurrentItem(); if ( index == 0 ) pager.setCurrentItem( adapter.getCount() - 2, false ); else if ( index == adapter.getCount() - 1 ) pager.setCurrentItem( 1 , false); } } }); } public static class MyAdapter extends FragmentPagerAdapter { int[] promoImageIds; public MyAdapter(FragmentManager fm, int[] promoImageIds){ super(fm); this.promoImageIds = promoImageIds; } @Override public int getCount(){ return promoImageIds.length; } @Override public Fragment getItem(int position) { return PromoFragment.newInstance( promoImageIds[position] ); } } public static class PromoFragment extends Fragment { int imageID; static PromoFragment newInstance( int imageID) { PromoFragment f = new PromoFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt( "imageID", imageID ); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageID = getArguments() != null ? getArguments().getInt( "imageID" ) : null; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ImageView v = (ImageView) inflater.inflate(R.layout.fragment_image, container, false); v.setImageResource( imageID ); return v; } } } 

Para el desplazamiento infinito con los días es importante que tenga el buen fragmento en el buscapersonas por lo tanto escribí mi respuesta en esta página ( Viewpager en Android para cambiar entre los días sin fin )

¡Está funcionando muy bien! Las respuestas anteriores no funcionaban para mí, ya que quería que funcionara.

RecyclerViewPager tiene ejecutar desplazamiento infinito y puede desplazarse como un gallary. https://github.com/lsjwzh/RecyclerViewPager/

  • LED de notificación - color
  • ¿Pueden las anotaciones de Gson y Jackson coexistir en el mismo POJO?
  • Cómo llegar a la etapa en el centro en libgdx?
  • Android Eliminar el fondo de SeekBar
  • Recuperar mediante programación permisos de manifest.xml en android
  • Error de Android RecyclerView
  • Recursos de Android: ¿Cómo se cargan los mapas de bits de los recursos manejados en cuanto a memoria?
  • ¿Cuáles son los usos correctos de @NonNull y @Nullable?
  • Cómo averiguar la cara detectada es real o falsa
  • Android requiere el nivel de cumplimiento del compilador 5.0 o 6.0. Se encontró '1.7' en su lugar. Utilice Herramientas de Android> Fijar propiedades del proyecto
  • La página de registro de usuario no valida
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.