2

我需要显示一个 ViewPager,最初只显示一个视图。一旦此视图通过测量和布局传递,根据这些结果,我可能需要更改适配器的内容。这样做时,我遇到了这样一种情况,即 ViewPager 在尝试从某个位置滑动到下一个项目时不会跟随它的移动。
我确定我在我的适配器实现中做错了什么,但我无法指出问题所在。

为了演示,我创建了一个虚拟适配器,它将模仿我实际项目中发生的情况。为了重现该问题,只需尝试一直滑动到位置 2(第 3 项),结果是您无法越过位置 1(第 2 项)。

谢谢!

public class CustomAdapter extends PagerAdapter {
    int pages = 0;

    @Override
    public int getCount() {
        return pages;
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        return view == o;
    }

    public void setPages(int x) {
        this.pages = x;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        TextView tv = new TextView(MainActivity.this);
        ViewGroup.LayoutParams lp =
                new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);

        tv.setLayoutParams(lp);
        tv.setText("Position: " + position);

        if (position == 0 && pages == 1) {
            setPages(2);
            notifyDataSetChanged();
        }
        if (position == 1 && pages == 2) {
            setPages(3);
            notifyDataSetChanged();
        }

        container.addView(tv);
        return tv;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }
}

活动(onCreate 左右):

    CustomAdapter adapter = new CustomAdapter();
    adapter.setPages(1);
    vp.setAdapter(adapter);
    adapter.notifyDataSetChanged();
4

1 回答 1

2

instantiateItem item 方法是错误的地方。因为它只适用于一个视图,它同时适用于 3 个视图。

尝试移动

    if (position == 0 && pages == 1) {
        setPages(2);
        notifyDataSetChanged();
    }
    if (position == 1 && pages == 2) {
        setPages(3);
        notifyDataSetChanged();
    }

setPrimaryItem方法

更新:

尝试在instantiateItem方法中为您想要的位置调用setPrimaryItem 方法。你可以这样做,因为它是instantiateItem一种public方法。但我不知道它是如何工作的,这是一个理论。试一试。

于 2013-09-23T12:06:06.897 回答