嵌套ViewPager,调用其setCurrentItem方法失效
今天在一个自定义的ViewGroup中嵌套了ViewPager,为了能显示ViewPager前后两页的内容,但是发现使用过程中,ViewPager的setCurrentItem无效了,始终都是从第0页开始显示,求大侠指导。
自定义ViewGroup代码如下:
public class PagerContainer extends FrameLayout implements ViewPager.OnPageChangeListener {
private ViewPager mViewPager;
private boolean mNeedsRedraw = false;
private Point mCenter = new Point();
private Point mInitialTouch = new Point();
public PagerContainer(Context context) {
this(context, null);
}
public PagerContainer(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public PagerContainer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData();
}
private void initData() {
// 允许子View在其区域内进行绘制
setClipChildren(false);
// child clip功能在Android3.x之后的版本会因为硬件加速而不起作用,所以这里需要关闭硬件加速功能
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
try {
mViewPager = (ViewPager) getChildAt(0);
mViewPager.setOnPageChangeListener(this);
} catch (Exception e) {
throw new IllegalStateException("The root child of PagerContainer must be a ViewPager");
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mCenter.x = w / 2;
mCenter.y = h / 2;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mInitialTouch.x = (int) event.getX();
mInitialTouch.y = (int) event.getY();
default:
event.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y);
break;
}
return mViewPager.dispatchTouchEvent(event);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (mNeedsRedraw) invalidate();
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
mNeedsRedraw = (state != ViewPager.SCROLL_STATE_IDLE);
}
public ViewPager getViewPager() {
return mViewPager;
}
}
布局如下:
<com.yunos.ui.widget.PagerContainer
android:id="@+id/pager_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager_layout"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"/>
</com.yunos.ui.widget.PagerContainer>
MainActivity初始化代码:
private void initView() {
mPagerContainer = (PagerContainer) findViewById(R.id.pager_container);
mViewPager = mPagerContainer.getViewPager();
Log.e(TAG, "get viewpager current item=" + mViewPager.getCurrentItem());
// 如下方法失效,求指导
mViewPager.setCurrentItem(1);
Log.e(TAG, "get viewpager current item=" + mViewPager.getCurrentItem());
mViewPager.setOffscreenPageLimit(AppPageAdapter.NUM_ITEMS);
mViewPager.setClipChildren(true);
mViewPager.setPageMargin(15);
mFragmentPagerAdapter = new AppPageAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
唉,傻逼了,自己看了下ViewPager关于setCurrentItem的源码,发现:
应该在setAdapter之后再调用setCurrentItem,这种傻逼错误都犯了,对自己无语了。
问题就不删了,给大家也一个警告吧,防止范类似的错误!
这是一行错误代码,container并没有setCurrentItem方法,应该是
mViewPager.setCurrentItem(1);
setCurrentItem要在setAdapter之后。
mPagerContainer要设置谁的currentIterm。log中打印的确实mViewPager