ViewPager
有一个用例,我从来没有见过很好的实现。
ViewPager
或多或少是静态结构。将页面添加到右侧(附加到模型并显示它)并不困难,但是,应该有一个很好用的解决方案来扩展PagerAdapter(或其某些子类),以便它可以向两个方向扩展。
我可以想象适合这样的接口
boolean isEmpty()
boolean hasNext()
boolean hasPrevious()
Object getNext()
Object getPrevious()
Object getItem(int position)
// or if using generics
T getNext()
T getPrevious()
T getItem(int position)
与Collections Iterator类似,但是双向。
索引/位置不限于0以下,但可以使用整个范围的整数类型 也许不是基于数组的实现(从0到无限)。
我发现了这个" hack":dynamically add and remove view to viewpager
但正如我之前所说,我试图让它自然地工作,而不是维护3,5,...项目并迫使ViewPager根据一些扭曲的逻辑改变当前位置
目前是否有足够的实施或是否有必要实施? 如果这将是一个全新的实施,我愿意赏金奖励答案。
答案 0 :(得分:7)
这会有所帮助,
public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public Fragment getItem(int position) {
return getFragmentBasedOnPosition(position);
}
private Fragment getFragmentBasedOnPosition(int position) {
int fragmentPos = position % 3; // Assuming you have 3 fragments
switch(fragmentPos) {
case 1:
return Fragment1.newInstance();
case 2:
return Fragment2.newInstance();
case 3:
return Fragment3.newInstance();
}
}
}
然后,
mPager.setCurrentItem((int)(Integer.MAX_VALUE/2));
//假设mPager是您的ViewPager
答案 1 :(得分:2)
使用负位置值远远高于ViewPager使用的自然顺序非常,根本不是适配器问题。请查看Android SDK支持包源代码中的ViewPager源代码。例如,这是一个setCurrentItemInternal私有实现:
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
if (mAdapter == null || mAdapter.getCount() <= 0) {
setScrollingCacheEnabled(false);
return;
}
if (!always && mCurItem == item && mItems.size() != 0) {
setScrollingCacheEnabled(false);
return;
}
if (item < 0) {
item = 0;
} else if (item >= mAdapter.getCount()) {
item = mAdapter.getCount() - 1;
}
final int pageLimit = mOffscreenPageLimit;
if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
// We are doing a jump by more than one page. To avoid
// glitches, we want to keep all current pages in the view
// until the scroll ends.
for (int i=0; i<mItems.size(); i++) {
mItems.get(i).scrolling = true;
}
}
final boolean dispatchSelected = mCurItem != item;
populate(item);
scrollToItem(item, smoothScroll, velocity, dispatchSelected);
}
如您所见,ViewPager 显式假设没有负面的位置值。