我有两项活动。活动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个和解决它的方法。
答案 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();
}
}
}