Viewpager no obtiene el último elemento

Estoy utilizando dos Viewpager en mi aplicación,

1) First Viewpager sólo muestra imágenes

2) Estoy mostrando el precio

Ahora el problema es que tengo 4 imágenes que muestran en mi viewpager1, y en segundo paginador tengo el precio según el producto seleccionado. Primera vez que no muestra nada, pero cuando la imagen de desplazamiento y va a la siguiente, muestra el precio ..

  pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { Picasso.with(ProductLandingActivity.this) .load(categorylist.get(position).getProductLanding_packLink()) .error(R.drawable.nopreview ) .placeholder(R.drawable.progress_animation) .into(selectedImage); System.out.println("Selected is"+position); selectedname.setText(categorylist.get(position).getProductLanding_packDesc()); for (int i = 0; i < categorylist.get(position).getItems().size(); i++) { System.out.println("ProductPack_ID : " + categorylist.get(position).getItems().get(i).getPackSize_sellingPrice()); } temp = categorylist.get(position).getItems(); packadapter = new MyPacksPagerAdapter(ProductLandingActivity.this,categorylist); pagerpacks.setAdapter(packadapter); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); 

adaptador

 private class MyPacksPagerAdapter extends PagerAdapter { Context context; ArrayList<PackListModel> packsizedata ; public MyPacksPagerAdapter(Context context,ArrayList<PackListModel> packsizedata) { this.context = context; this.packsizedata = packsizedata; } @Override public Object instantiateItem(ViewGroup container, int position) { final OneActor oneActor; View view; LayoutInflater infl = ((Activity)context).getLayoutInflater(); view = infl.inflate(R.layout.list_item_pagerpacktitles, container,false); oneActor = new OneActor(); // oneActor.avatar = (ImageView) view.findViewById(R.id.image); oneActor.name = (TextView) view.findViewById(R.id.product_landing_packsname); oneActor.cmtCount = (TextView) view.findViewById(R.id.product_landing_packsprice); view.setTag(oneActor); oneActor.name.setText(temp.get(position).getPackSize_packSize()); oneActor.cmtCount.setText(temp.get(position).getPackSize_sellingPrice()); ((ViewGroup) container).addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } @Override public int getCount() { return packsizedata.size(); } @Override public boolean isViewFromObject(View view, Object object) { return (view == object); } class OneActor{ // ImageView avatar; TextView name,cmtCount; } } 

Por defaulat cuando ejecuto la aplicación se muestra así, en el segundo buscapersonas no se muestra el precio del producto,

Introduzca aquí la descripción de la imagen

Pero cuando la imagen de desplazamiento que muestra el precio

Introduzca aquí la descripción de la imagen

Mi producción esperada es

Introduzca aquí la descripción de la imagen

Esta es mi respuesta json

Http://pastebin.com/fbJang2B

En primer lugar, como se menciona por @NotobharatKumar, está cargando el segundo adaptador en un evento incorrecto del adaptador padre, es decir, en el método onPageScrolled . En segundo lugar, está configurando un nuevo adaptador cada vez en ese evento específico, parece inútil. Por último, está configurando los datos de un evento, (no estoy seguro de por qué está haciendo esto, pero) Preferiría establecerlo en un adaptador separado y dejar que el receptor de eventos para comportamientos específicos.

Para mí, parece que usted tiene dos adaptadores separados , pero una lista de datos compartida por ambos. Asumiendo que, usted tiene que fijarlos ambos en el comienzo con sus datos respetly, y en el acontecimiento onPageSelected del adaptador superior, usted apenas tiene que desplazar automáticamente el segundo. Y si tienen la misma posición en la lista, onPageSelected debe hacer el trabajo correctamente.


Por lo tanto, estas modificaciones deben resolver su problema:

Su código en onScrollChanged , cuando usted fija la imagen y el texto, parece realmente extraño a mí. Utilizaría un primer adaptador donde ViewPager todos los datos como estos dos para el primer ViewPager :

 @Override public void onCreate(Bundle savedInstansteState) { ... // set a simple adapter for the first ViewPager FirstPagerAdapter imageadapter = new FirstPagerAdapter(ProductLandingActivity.this, categorylist); pagerimages.setAdapter(imageadapter); ... } 

A continuación, como de costumbre, establezca sus datos en FirstPagerAdapter:

 @Override public View getView(int position, View view, ViewGroup container) { ... // set the content Picasso.with(ProductLandingActivity.this) .load(categorylist.get(position).getProductLanding_packLink()) .error(R.drawable.nopreview ) .placeholder(R.drawable.progress_animation) .into(selectedImage); selectedname.setText( categorylist.get(position).getProductLanding_packDesc()); ... } 

Entonces no es necesario (re) cargar la imagen o el texto cuando se desencadena un evento, ya que se mantendrá por el adaptador.

Sólo utiliza getPackSize_packSize() y getPackSize_sellingPrice() en el segundo adaptador, por lo que debe crear una lista separada para llenar sólo con estos datos pero fuera del evento swiping. Comience por inicializar la segunda lista y los adaptadores:

 // get the Items to fill the pack items list (like you did for `temp`) ArrayList<Items> packItems = new ArrayList<>(); for (int i = 0; i < categorylist.size(); i++) { packItems.add(categorylist.get(position).getItems()); } // fill the first adapter with your list of products (ie categorylist) ... pagerimages.setAdapter(imageadapter); ... // fill the second adapter with the pack items list packadapter = new MyPacksPagerAdapter(ProductLandingActivity.this, packItems); pagerpacks.setAdapter(packadapter); 

Tienes que hacer esto cuando categorylist se crea y se rellena . Así que coloque este código por ejemplo en su devolución de llamada, cuando recupere los datos de su servidor.

Puesto que la segunda lista packItems está llenando el mismo orden que categorylist , no habrá ningún comportamiento extraño cambiando las dos posiciones. Ahora, en el segundo adaptador, es preferible usar la lista local packsizedata , como sigue:

 @Override public Object instantiateItem(ViewGroup container, int position) { ... oneActor.name.setText( packsizedata.get(position).getPackSize_packSize()); oneActor.cmtCount.setText( packsizedata.get(position).getPackSize_sellingPrice()); ... } 

Finalmente, controla el ViewPager inferior usando el evento onPageSelected de la primera:

 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { // set the second current page regarding the position of the first pagerpacks.setCurrentItem(position); } @Override public void onPageScrollStateChanged(int state) { } }); 

Esperamos que esto sea útil.

Debe implementar el código para la acción en el método onPageSelected porque después de cambiar la página de su ViewPager entonces onPageSelected será llamado.

  • Cómo mover el elemento específico en la lista de arreglos al primer elemento
  • Adaptador de matriz de Android Selección del ID incorrecto
  • Eliminar duplicado en ArrayList de objetos personalizados
  • Filtro ArrayList después de convertir un largo (de los constructores) a un String
  • Cómo eliminar el valor duplicado de arraylist en Android
  • Android - Cómo combinar dos ArrayLists
  • Cómo poner elementos anidados de archivo XML a la lista de objetos con VTD-XML parser?
  • Android, ¿Cómo usar el método readTypedList correctamente en una clase Parcelable?
  • ¿Cómo puedo devolver un ArrayList de mi AsyncTask?
  • Pasar una lista de una actividad a otra
  • Obtener una matriz de CLAVES para cada elemento bajo jsonarray
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.