ViewPager设置当前项> 0创建片段的两个实例

时间:2016-09-08 06:39:33

标签: android android-viewpager

我有两项活动。活动A和活动B

活动A - 有一个列表视图

活动B - 具有带有FragmentStatePagerAdapter的ViewPage

每当用户点击列表视图中的任何项目时。我开始活动B传递点击项目的索引。在活动B中,在viewpager上设置适配器,并将currentItem设置为在活动A上单击的项目的索引。

现在问题是viewpager首先为第0个项目创建片段,然后创建索引项目。我不想要创建额外的项目。任何解决方案?

部分代码:

ViewPager vp = (ViewPager) findViewById(R.id.pager);
ViewPagerAdapter pagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), cursor);
vp.setAdapter(pagerAdapter);
vp.setCurrentItem(index);

private class ViewPagerAdapter extends FragmentStatePagerAdapter {

        private Cursor cursor;

        public ViewPagerAdapter(FragmentManager fragmentManager, Cursor cursor) {
            super(fragmentManager);
            this.cursor = cursor;
        }   

        @Override
        public Fragment getItem(int index) {
                return new Fragment(index);
        }

        @Override
        public int getCount() {
            return cursor.getCount();
        }

}

更新:我知道ViewPage会创建当前片段的左侧和右侧。但在我的情况下,如果我将setCurrentItem设置为10,那么除了第9和第11之外,它还会创建第0个。在我调用vp.setAdapter(pagerAdapter)后立即创建第0个项目,并在下一行设置currentItem,当它转到索引项目时。问题不在于任何滚动问题。问题是为什么它创造了第0个和解决它的方法。

3 个答案:

答案 0 :(得分:1)

我猜你想要的行为是不可能的 ViewPager实施。 ViewPager取决于"滚动"关于当前邻居的行为和知识,并缓存这些观点。所以内部setCurrentItem

 setCurrentItemInternal(item, !mFirstLayout, false);

在这个方法中:

mCurItem = item;
if (dispatchSelected) {
    dispatchOnPageSelected(item);
}
requestLayout();

最后在onLayout上:

scrollToItem(mCurItem, false, 0, false);

ViewPager将创建当前页面的邻居(共3个片段)。您可以将其减少为仅创建2个片段:

mViewPager.setCurrentItem(id, false); //disable smooth scroll

同样改变你的片段:

private static final String ARG_INDEX = "itemPosition";
private int mPageIndex;

public static BlankFragment newInstance(int index) {
    BlankFragment fragment = new BlankFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_INDEX, index);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mPageIndex = getArguments().getInt(ARG_INDEX);
    }
}

并像这里一样使用:

@Override
public Fragment getItem(int position) {
    return BlankFragment.newInstance(position);
}

您可以依赖片段构造器将参数传递给片段,因为它可以重新创建。

答案 1 :(得分:0)

我通过在我的适配器中添加一个检查并返回一个虚拟片段来解决它。

示例代码:

private class ViewPagerAdapter extends FragmentStatePagerAdapter {

        private int currentItemIndex,count;
        private boolean currentItemCreated;

        public ViewPagerAdapter(FragmentManager fragmentManager, int currentItemIndex,int count) {
            super(fragmentManager);
        this.count= count;
            this.currentItemIndex = currentItemIndex;
        }


        @Override
        public Fragment getItem(int index) {
            if (index == currentItemIndex) {
                currentItemCreated = true;
            }
            if (currentItemCreated) {

                return new YourFragment();
            } else {
                return new Fragment();
            }
        }


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

    } 

答案 2 :(得分:-1)

试试这个

  private class ViewPagerAdapter extends FragmentStatePagerAdapter {

        private Cursor cursor;
        private int index;

        public ViewPagerAdapter(FragmentManager fragmentManager, Cursor cursor,int indext) {
            super(fragmentManager);
            this.cursor = cursor;

            this.index=indext;
        }

        @Override
        public Fragment getItem(int index) {
            //method to find fragment at that index
            return fragment();
        }

        @Override
        public int getCount() {
            return cursor.getCount();
        }

    }
}