【问题标题】:ViewPager pageSelected is not working properlyViewPager pageSelected 无法正常工作
【发布时间】:2016-04-20 17:34:57
【问题描述】:

我正在尝试将 ViewPager 添加到我的应用程序中,但效果并不好。是这样的:

  • 我在 Viewpager 的位置 0 启动应用程序,一切正常。
  • 我向右滚动到位置 2,但一切仍在工作
  • 我滚动到位置 3,它是空的(有时)
  • 在此之后,如果我回到位置 0 或 3,它总是为空,只有位置 1 工作

我已经有很多天认为这是我的代码(我正在使用一个很棒的 openGL 应用程序,它使用状态来在页面之间进行更改,并且我正在尝试使这些状态适应 ViewPager)。但是今天我试图改变布局的位置,然后我再次看到那个不工作的是中间那个(这是旧的位置 0)。所以我真的认为问题在于我是如何创建 Viewpager 的。

这是我的代码:

 <RelativeLayout
    android:id="@+id/myApp_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <include
            android:id="@+id/toolbar"
            layout="@layout/toolbar" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >

            <com.android.myApp3d.ui.GLRootView
                android:id="@+id/gl_root_view1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

            <com.android.myApp3d.ui.GLRootView
                android:id="@+id/gl_root_view2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>


            <com.android.myApp3d.ui.GLRootView
                android:id="@+id/gl_root_view3"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>


        </android.support.v4.view.ViewPager>
        <View android:id="@+id/gl_root_cover_myApp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#fafafa"
            />
    </LinearLayout>
</RelativeLayout>

这是我的 ViewPager 的 CustomAdapter:

public class CustomPagerAdapter extends PagerAdapter {

private Context mContext;
private static final String TAG = "CustomPageAdapter";
public CustomPagerAdapter(Context context) {
    mContext = context;
}

@Override
public Object instantiateItem(ViewGroup collection, int position) {
    int resId = 0;
    switch (position) {
        case 0:
            resId = R.id.gl_root_view1;
            break;
        case 1:
            resId = R.id.gl_root_view2;
            break;
        case 2:
            resId = R.id.gl_root_view3;
            break;
    }
    return collection.findViewById(resId);
}

@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
    collection.removeView((View) view);
}

@Override
public int getCount() {
    return 3;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

    @Override
    public CharSequence getPageTitle(int position) {
return "something";}}

这是我初始化 ViewPager 的 MainActivity 的代码:

 public void initView() {
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setActionBar(mToolbar);
    setToolbar(mToolbar);

    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    mViewPager.setAdapter(new CustomPagerAdapter(this));
    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            setGLRootView(position);
            getGLRoot().lockRenderThread();
            showScreen(position);
            getGLRoot().unlockRenderThread();
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });

}

public void showScreen(int position) {
    if (position > 2) {
        position = 1;
    }
    switch (position) {

    case 0:
        startMusicPage(); 
        break;
    case 1:
        startImagePage(); 
        break;
    case 2:
        startVideoPage(); 
        break;
    default:
        break;
    }
    mToolbar.setTitle(getResources().getStringArray(
            R.array.title_array_nav_items)[position]);

    mToolbar.setNavigationContentDescription("drawer");
}

【问题讨论】:

    标签: android xml view opengl-es android-viewpager


    【解决方案1】:

    我不知道为什么会这样,但是如果你第一次看到它们是正确的,但接下来的时候不是,你不能尝试:

    viewPager.setOffscreenPageLimit(2);
    

    这将只加载所有页面一次,因此您必须评估在加载时加载所有页面是否重要。

    【讨论】:

    • 成功了!谢谢朋友,你让我开心!