2014-09-25 56 views
6

我知道我可以做的Android - ViewPager适配器,适配器之前设置的主项被实例化

viewPager.setCurrentItem(position) 

,在需要的位置设置我的看法寻呼机。我的问题是,如果和如何在适配器实例化之前做到这一点。

也就是说,如果我做

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

项目0是第一个构建之后,在所需位置的项目也被建立。这需要两倍的时间......在我的适配器中,每个项目都需要构建很多工作,因此如果可能,最好避免构建0位置项目。也许通过在适配器的实例化处传递期望的位置作为参数...?

任何方式来做到这一点?

回答

1

你可以欺骗viewpager在给定的位置,开始之前将适配器设置,通过调用onRestoreInstanceState,像这样:

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); 
+0

不幸的是,这在Android M中不再适用,请参阅我的新答案 – 2015-09-03 23:01:28

+0

已更新,以使用Android M – 2015-09-08 13:26:54

3

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

0

你可以做到这招:

重构所有繁重的工作到一个函数的,因为建立一个fragment是不是要花很多时间,并且只通过调用函数执行该功能时,用户会看到它里面OnPageChangeListener监听器,并在

@Override 
public void onPageSelected(int position){ 
    // call your function that do heavy working 
} 
1

对于在版本的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

您可以设置空白适配器,然后以这种方式设置真正的适配器,您将“欺骗”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);