2016-04-20 7 views
2

Я пытаюсь добавить ViewPager в свое приложение, и он работает не очень хорошо. это так: -I запускаю приложение, в позиции 0 моего Viewpager, все в порядке. -I прокрутите вправо до положения 2 и все еще работаю -I прокрутите до положения 3, и оно пусто (иногда) -После этого, если я вернусь в позицию 0 или 3, он всегда пуст, только позиция 1 работаетViewPager pageSelected не работает должным образом

Я много дней думал о том, что это мой код (im работает с удивительным приложением openGL, которое использует состояния для изменения между страницами, а Im пытается адаптировать эти состояния к 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> 

Это мой CustomAdapter для ViewPager:

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";}} 

А вот код моего MainActivity где я inizializate мой ViewPager:

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"); 
} 

Надежда, что кто-то сможет мне немного помочь, я действительно отчаянно пытался это исправить.

ответ

1

Я не знаю, почему это происходит, но если первый раз, когда вы видите их право, но не следующие раз, вы не можете попробовать:

viewPager.setOffscreenPageLimit(2); 

Это только один раз загрузить все страницы, так вы должны оценить, важно или не загружать их все при загрузке.

+0

It Worked! Спасибо, вы сделали мой день! –

Смежные вопросы