我知道我能做到
viewPager.setCurrentItem(position)
将我的视图寻呼机设置在所需位置。我的问题是在实例化适配器之前我是否以及如何做到这一点。
如果我这样做意味着
pagerAdapter = new ViewPagerAdapter(arg1,arg2....);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(position);
第0项是第一次构建,之后也构建了所需位置的项目。这需要花费两倍的时间......在我的适配器中,每个项目都需要构建很多工作,所以最好避免在可能的情况下构建0位置项。也许通过在适配器的实例化中传递所需的位置作为参数......?
有什么办法吗?
答案 0 :(得分:3)
如果时间和工作是你担心的,我会尽量避免在0号位置构建页面,直到建立了所需的页面。您可以在适配器中使用变量let say“desiredPageHasBeenBuilt”,当请求位置0处的项目时,如果变量desiredPageHasBeenBuilt为false,则可以返回“空白页面”,当您构建所需页面时,将变量设置为true并且第0页可以建立。
答案 1 :(得分:3)
你可以设置空白适配器,然后以这种方式设置真正的适配器,你将"技巧" viewpager,你想加载你不想要的任何数据。
this.viewPager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return false;
}
});
this.viewPager.setCurrentItem(imagePosition, false);
this.viewPager.setAdapter(adapter);
this.viewPager.setCurrentItem(imagePosition, false);
答案 2 :(得分:2)
对于适用于Android M以及旧版本的解决方案,请按如下方式使用反射:
int currentItem = 5;
// Set initial position first...
Field field = ViewPager.class.getDeclaredField("mRestoredCurItem");
field.setAccessible(true);
field.set(mPager, currentItem);
// ...and then set adapter
mPager.setAdapter(adapter);
使用反射是安全的,因为您可以控制ViewPager
实施(它包含在您的应用中)。
如果您使用Proguard,则需要在其配置中包含以下内容:
-keepclassmembers class android.support.v4.view.ViewPager {
private int mRestoredCurItem;
}
或者字段mRestoredCurItem
将由Proguard重命名。
答案 3 :(得分:1)
你可以通过调用onRestoreInstanceState来欺骗viewpager在设置适配器之前从给定位置开始,如下所示:
int currentItem = 5;
Parcel parcel = Parcel.obtain();
writeParcelable(BaseSavedState.EMPTY_STATE, 0);
writeInt(currentItem);
writeParcelable(null, 0);
setDataPosition(0);
SavedState savedState = ViewPager.SavedState.CREATOR.createFromParcel(parcel);
mPager.onRestoreInstanceState(savedState);
mPager.setAdapter(mAdapter);
答案 4 :(得分:0)
也许这不是您正在寻找的答案,但您是否尝试过它的设计?在页面片段连接到屏幕之前,不要开始繁重的工作。这样你就可以获得你想要的行为而不会破坏Android实现。
答案 5 :(得分:-1)
你可以做到这一点:
将所有繁重的工作重构为一个函数,因为创建一个fragment
并不需要花费太多时间,只有当用户通过在OnPageChangeListener
监听器中调用该函数来查看它时才执行该函数在
@Override
public void onPageSelected(int position){
// call your function that do heavy working
}