Viewpager no obtiene el último elemento
Estoy utilizando dos Viewpager
en mi aplicación,
1) First Viewpager
sólo muestra imágenes
- Android ArrayList iteration
- Tener problemas para vincular un objeto ksoap a un ArrayList en Android
- Java: Eficaz ArrayList filtrado?
- ¿Cuál es la diferencia entre List y ArrayList?
- Cómo guardar los datos de arrayList en SharedPreferences?
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,
Pero cuando la imagen de desplazamiento que muestra el precio
Mi producción esperada es
Esta es mi respuesta json
Http://pastebin.com/fbJang2B
- Serializar una ArrayList
- Cómo manejar ConcurrentModificationException en Android
- Custom ListView Android
- Clase Java, Arraylist con varios tipos
- ArrayList <CustomClass> en SharedPreferences
- Java, ordene un ArrayList con entradas más largas al final
- Convertir ArrayList a String array en Android
- ¿Cómo puedo crear una lista Array con los datos del cursor en Android
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.