【问题标题】:Viewpager not getting last itemViewpager 没有得到最后一项
【发布时间】:2016-12-19 06:55:55
【问题描述】:

我在我的应用中使用了两个Viewpager

1) 首先Viewpager 只显示图片

2) 我正在显示价格

现在的问题是,我的 viewpager1 中显示了 4 张图像,而在第二个寻呼机中,我根据所选产品显示了价格。第一次它没有显示任何东西,但是当我滚动图像并转到下一个时,它显示价格..

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

默认情况下,当我运行它显示的应用程序时,在第二个寻呼机中它不显示产品价格,

但是当我滚动图片时它会显示价格

我的预期输出是

这是我的 json 响应

http://pastebin.com/fbJang2B

【问题讨论】:

  • onPageSelected中添加你的逻辑。
  • 我试过了。现在当我滚动价目表时,它会崩溃无效索引
  • 发布你的崩溃日志和MyPacksPagerAdapter 的代码
  • 我在所选页面中添加了我的代码..现在它以 1 开始索引..
  • @Pr38y 你能告诉我

标签: android android-layout arraylist android-viewpager android-pageradapter


【解决方案1】:

首先,正如@NotobharatKumar 所述,您在父适配器的错误事件中加载第二个适配器,即在onPageScrolled 方法中。其次,您每次都在该特定事件上设置一个新适配器,这似乎没用。最后,您要在事件中设置数据,(我不确定您为什么要这样做,但是)我更愿意将其设置在单独的适配器中,并让事件侦听器针对特定行为.

对我来说,您似乎有两个单独的适配器,但两者共享一个数据列表。假设您必须在开始时分别设置它们的数据,并且在顶部适配器的事件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());
    ...
}

最后,使用第一个的onPageSelected事件控制底部ViewPager

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

希望这会有所帮助。

【讨论】:

  • @chris 对我来说,PackSizeModel 应该是一个只有两个变量 packSizesellingPrice 的类,所以你只需要找到并添加到列表中只有这个类填写了这两个数据。您实际上返回的是 PackSizeModel 的数组列表,而您只需要数据。
  • 代码中要改变什么?以及如何获得解决方案
  • 兄弟需要你的帮助,你能告诉我要改变什么吗?
  • @chris PackSizeModel 应该是 something like thisgetItems() 应该返回 PackSizeModel 而不是数组。 getItems() 中进行一些更改以返回填充模型而不是此模型的数组列表。
  • 你能帮忙吗?
【解决方案2】:

您应该在onPageSelected 方法中实现操作代码,因为在您的ViewPager 页面更改后,onPageSelected 将被调用。

【讨论】:

  • position 总是从 0 开始。肯定有什么 bug。你能分享你的代码吗?
  • 你现在可以检查吗?
  • 您在代码中使用了两个寻呼机。哪一个有问题?
  • 当我滚动第一个视图寻呼机时,第二个设置不正确
  • 我认为您在方法 onPageSelected() 中的适配器上使用了错误的数组,请检查。 packadapter = new MyPacksPagerAdapter(ProductLandingActivity.this,categorylist);
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 2020-12-28
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多