8

我知道我能做到

 viewPager.setCurrentItem(position) 

将我的视图寻呼机设置在所需位置。我的问题是在实例化适配器之前是否以及如何执行此操作。

意思是如果我这样做

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

项目 0 是第一次构建,然后在所需位置的项目也被构建。这需要双倍的时间......在我的适配器中,每个项目都需要大量的工作来构建,所以如果可能的话,最好避免构建 0 位置的项目。也许通过在适配器实例化时将所需位置作为参数传递......?

有什么办法吗?

4

6 回答 6

3

如果您担心的是时间和工作,我会尽量避免在位置 0 构建页面,直到构建所需的页面。您可以在适配器中使用变量让我们说“desiredPageHasBeenBuilt”,当请求位置 0 的项目时,如果变量 desiredPageHasBeenBuilt 为 false,则可以返回“空页面”,当您想要的页面已构建时,将变量设置为 true 并且可以建立第 0 页。

于 2014-09-25T23:33:09.560 回答
3

对于适用于 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 重命名。

于 2015-09-03T23:06:57.213 回答
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);
于 2016-02-11T16:58:34.790 回答
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);
于 2015-07-07T12:46:51.017 回答
0

也许这不是您要寻找的答案,但是您是否按照设计尝试过?在页面片段附加到屏幕之前,不要在页面片段上开始繁重的工作。这样,您将获得所需的行为,而无需破解 android 实现。

于 2018-03-17T11:06:10.997 回答
-1

你可以这样做:

将所有繁重的工作重构为一个函数,因为创建一个fragmentis 不需要太多时间,并且仅在用户通过在侦听器中调用该函数OnPageChangeListener并在

@Override
public void onPageSelected(int position){
    // call your function that do heavy working  
}
于 2014-09-26T02:00:55.163 回答