4

Я использую два Viewpager в моем приложении,ViewPager не получить последний элемент

1) Сначала Viewpager отображают изображения только

2) Я отображающий цену

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

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

      } 


     }); 

адаптера

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

По defaulat, когда я запустить приложение он показывает, как это, во втором пейджера он не показывает цену продукта,

enter image description here

Но когда я прокручивать изображение он показывает цену

enter image description here

Мой Ожидаемый выход

enter image description here

Это мой JSON ответ

http://pastebin.com/fbJang2B

+1

добавить свою логику в 'onPageSelected'. – Pr38y

+0

Я пробовал этот путь. Теперь, когда я прокручиваю прайс-лист, он разбивает недействительный индекс – chris

+0

публикует ваш ловушка с ошибкой и код «MyPacksPagerAdapter» – Pr38y

ответ

4

Во-первых, как упоминалось @NotobharatKumar, вы загружаете второй адаптер на неправильное событие родительского адаптера, то есть в метод onPageScrolled. Во-вторых, вы устанавливаете новый адаптер каждый раз на этом конкретном событии, это кажется бесполезным. Наконец, вы устанавливаете данные в событии, (я не уверен, почему вы это делаете) Я бы предпочел установить его в отдельном адаптере и позволить слушателям событий для определенного поведения.

Для меня, кажется, что у вас есть два отдельных адаптеров, но список один Datas совместно обоими. Предполагая, что вы должны установить их как в начале с их данными, так и в случае onPageSelected верхнего адаптера, вам просто нужно автоматически прокрутить второй. И если они имеют одинаковую позицию в списке, onPageSelected должен правильно выполнить работу.


Таким образом, эти изменения должны решить вопрос:

Ваш код в onScrollChanged, когда вы установите изображение и текст, кажется, действительно странно для меня.Я хотел бы использовать первый адаптер, где я буду устанавливать все ДАННЫЕ, как эти два на первый 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); 
    ... 
} 

Затем, как обычно, установить ДАННЫЕ в 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()); 
    ... 
} 

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

Во втором адаптере вы используете только getPackSize_packSize() и getPackSize_sellingPrice(), поэтому вам нужно создать отдельный список, который будет заполняться только этими данными, но вне событий проверки. Для начала инициализации второго списка и адаптеров:

// 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); 

Вы должны сделать это, когда categorylist создается и заполняется. Поэтому разместите этот выше код, например, в своем обратном вызове, когда вы извлекаете данные с вашего сервера.

Поскольку второй список packItems заполняется в том же порядке, чем categorylist, не будет странного поведения, изменив оба положения. Теперь, во втором адаптере, то предпочтительнее использовать локальный список packsizedata следующим образом:

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

Наконец, контроль нижнюю ViewPager с помощью onPageSelected события первого:

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) { } 
}); 

Надежда это будет полезно.

+0

мы почти близки. .. проверьте http: // cardboard.co/fv6OsfRxA.png – chris

+0

@chris Для меня 'PackSizeModel' должен быть классом с ** ** двумя переменными **' packSize' и 'sellingPrice', поэтому вам нужно всего лишь найти и добавить в список только этот класс, заполненный с этими двумя данными. Вы фактически возвращаете arraylist PackSizeModel, тогда как вам нужны только данные. – Fllo

+0

Что менять в коде? и как я могу получить решение – chris

2

Вы должны реализовать код для действий на onPageSelected метод, потому что после того, как страница изменена вашего ViewPager, то будет называться onPageSelected.

+0

начальный индекс с 1 .. – chris

+1

позиция всегда начинается с 0. должно быть что-то ошибка. вы можете поделиться своим кодом. –

+0

Вы имеете в виду полный код? – chris

Смежные вопросы