我正在使用以下示例隐含我的viewPager:http : //code.google.com/p/viewpagerexample/issues/list
此示例的问题是我无法弄清楚如何设置起始位置,默认起始位置为0。基本上,我将无法控制左侧或右侧是否有可用视图。
有什么方法可以控制中心的“查看当前位置”?有更好的方法吗?有可能使其成为圆形吗?
我正在使用以下示例隐含我的viewPager:http : //code.google.com/p/viewpagerexample/issues/list
此示例的问题是我无法弄清楚如何设置起始位置,默认起始位置为0。基本上,我将无法控制左侧或右侧是否有可用视图。
有什么方法可以控制中心的“查看当前位置”?有更好的方法吗?有可能使其成为圆形吗?
Answers:
我找到了一种设置其位置的方法,该方法在课程之外进行:
awesomePager = (ViewPager) findViewById(R.id.awesomepager);
awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);
可以通过计算要放入的物品数量来限制它
currentPosition
尚未创建的片段中的变量
new LinearLayoutManager(..., inverse=true)
。我想要的是:ViewPager紧接着跳到最后一个项目,中间没有发火的片段
false
不会向用户显示发生的过渡: viewPager.setCurrentItem(newPosition, false);
我注意到,如果使用具有FragmentStatePagerAdapter的ViewPager重新创建Activity(方向更改),则Adapter将重用它的Fragments。停止它的方法是:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
if (viewPager != null) {
// before screen rotation it's better to detach pagerAdapter from the ViewPager, so
// pagerAdapter can remove all old fragments, so they're not reused after rotation.
viewPager.setAdapter(null);
}
super.onSaveInstanceState(savedInstanceState);
}
但是在Activity重新创建之后,ViewPager总是首先打开页面0,然后打开setCurrentItem(CurrentPosition);。不起作用。解决此问题的方法是在延迟后更改页面:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(newPosition);
}
}, 100);
recreate() call
!:)
我有一个大小超过1000的数组,在动态查看器中,我面临着卡在firstload上的向左滑动。以下代码解决了此问题,并实现了平滑滚动:
@Override
onResume(){
super.onResume();
viewPager.setCurrentItem(newPosition);
}
我正在使用3个片段,在启动我的应用程序时,默认情况下将显示第二个(中间)片段。只是我正在使用onResume函数,并且一切正常。
@Override
protected void onResume() {
super.onResume();
m_viewPager.setCurrentItem(1);
}
我遇到了同样的问题。当我初始化ViewPager时,指示器位置为0。这可能取决于对Pager内容的计算量。我使用如下所示的ViewTreeObserver。
mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mViewPager.setCurrentItem(newPosition);
removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
}
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);
和,
private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
if (observer == null) return;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
observer.removeGlobalOnLayoutListener(listener);
} else {
observer.removeOnGlobalLayoutListener(listener);
}
}
这样,也永远不会打扰延迟的时间设置。
使用viewPager.setCurrentItem(newPosition);
向用户显示从起始页面到的过渡newPosition
,以防止发生这种情况,并newPosition
直接将其显示为起始点,我false
在第二个参数中添加了以下内容:
int newPosition = pages.size()-1; // Get last page position
viewPager.setCurrentItem(newPosition, false); // 2nd parameter (false) stands for "smoothScroll"
@Override
public Object instantiateItem(ViewGroup container, int position) {
View currentPage = null;
switch(position){
case 0:
currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)
break;
case 1:
currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)
///////////// This page will be default ////////////////////
((ViewPager)container).setCurrentItem(position);
////////////////////////////////////////////////////////////
break;
case 2:
currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)
break;
return currentPage;
}