Android - ViewPager适配器,在实例化适配器之前设置主项

时间:2014-09-25 22:32:22

标签: android android-viewpager setcurrentvalue

我知道我能做到

 viewPager.setCurrentItem(position) 

将我的视图寻呼机设置在所需位置。我的问题是在实例化适配器之前我是否以及如何做到这一点。

如果我这样做意味着

pagerAdapter = new ViewPagerAdapter(arg1,arg2....);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(position);

第0项是第一次构建,之后也构建了所需位置的项目。这需要花费两倍的时间......在我的适配器中,每个项目都需要构建很多工作,所以最好避免在可能的情况下构建0位置项。也许通过在适配器的实例化中传递所需的位置作为参数......?

有什么办法吗?

6 个答案:

答案 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  
}