Viewpager没有得到最后一个项目 [英] Viewpager not getting last item

查看:58
本文介绍了Viewpager没有得到最后一个项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在应用中使用了两个Viewpager

I am using two Viewpager in my app,

1)首先Viewpager仅显示图像

2)我正在显示价格

现在的问题是我在viewpager1中显示4张图像,而在第二个寻呼机中,我按选定的产品定价.第一次不显示任何内容,但是当我滚动图像并转到下一个时,它显示价格.

now the issue is i have 4 images displaying in my viewpager1, and in second pager i have price as per selected product. first time it does not show anything, but when i scroll image and goes to next, it shows price..

 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运行我的应用程序时,它显示如下,在第二个寻呼机中,它不显示产品价格,

By defaulat when i run the app it shows like this,in second pager it is not showing product price,

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

But when i scroll image it shows price

我的预期输出是

这是我的json响应

http://pastebin.com/fbJang2B

推荐答案

首先,如@NotobharatKumar所述,您是在父适配器发生错误事件时(即在onPageScrolled方法中)加载第二个适配器.其次,您每次在特定事件上都设置一个新适配器,这似乎没有用.最后,您要在事件中设置数据,(我不确定为什么要这么做,但是)我希望将其设置在单独的适配器中,并让事件监听器了解特定行为

First, as mentioned by @NotobharatKumar, you're loading the second adapter on a wrong event of the parent adapter, ie in onPageScrolled method. Second, you're setting a new adapter each time on that specific event, it seems useless. Finally, you are setting datas in an event, (I'm not sure why you're doing this but) I'd prefer to set it in a separate adapter and let the events listener for specific behaviors.

对我来说,您似乎有两个单独的适配器,但是两个共享的一个数据列表.假设您必须在开始时分别设置它们的数据,并且在顶部适配器的事件onPageSelected上,只需要自动滚动第二个.如果它们在列表中的位置相同,则onPageSelected应该可以正确地完成工作.

For me, it seems that you have two separate adapters, but one datas list shared by both. Assuming that, you have to set them both at start with their datas respectly, and on the event onPageSelected of the top adapter, you just have to automatically scroll the second. And if they have the same position in the list, onPageSelected should do the work correctly.

因此,这些修改应该可以解决您的问题:

So, these modifications should solve your issue:

当您设置图像和文本时,您在onScrollChanged中的代码对我来说真的很奇怪.我将使用第一个适配器,在其中为第一个ViewPager设置所有类似于这两个数据:

Your code in onScrollChanged, when you set the image and the text, seems really weird to me. I'd use a first adapter where I'll set all the datas like these two for the first 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中设置数据:

Then, as usual, set your datas in the 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());
    ...
}

然后,在触发事件时,无需(重新)加载图像或文本,因为它们将由适配器保留.

Then no need to (re)load the image or the text when an event is triggered, since they will be holding by the adapter.

您仅在第二个适配器中使用getPackSize_packSize()getPackSize_sellingPrice(),因此您应该创建一个单独的列表以仅填充这些数据,但不在滑动事件之内.首先初始化第二个列表和适配器:

You only use getPackSize_packSize() and getPackSize_sellingPrice() in the second adapter, so you should create a separate list to only fill with these datas but outside the swiping event. Start by initializing the second list and the adapters:

// 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时必须执行此操作.因此,当您从服务器中检索数据时,请将上面的代码例如放在回调中.

You have to do this when categorylist is created and populated. So place this above code for example in your callback, when you retrieve the datas from your server.

由于第二个列表packItems的填充顺序与categorylist相同,因此通过更改两个位置不会有任何奇怪的行为. 现在,在第二个适配器中,最好使用本地列表packsizedata,如下所示:

Since the second list packItems is filling in the same order than categorylist, there will be no weird behavior by changing the both positions. Now, in the second adapter, it's preferable to use the local list packsizedata, as follows:

@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:

Finally, control the bottom ViewPager by using onPageSelected event of the first:

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

希望这会有所帮助.

这篇关于Viewpager没有得到最后一个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆