2

J'ai implémenté un ViewPager infini in situ https://github.com/JoachimR/AnyDayViewPager. Cependant, au lieu d'utiliser un PagerTabStrip, je préférerais utiliser un CoordinatorLayout avec TabLayout. Mais lors de la configuration de TabLayout avec le viewpager, (je suppose qu'il y a un "nombre infini de fragments ViewPager") l'application est bloquée.Infinite ViewPager avec TabLayout

Comment puis-je résoudre ce problème?

est ici le code (les autres fichiers que je ne l'ai pas changé peut être trouvé à JoachimR/AnyDayViewPager, par exemple, FragmentContent.java, CachingFragmentStatePagerAdapter.java, TimeUtils.java, etc.)

MainActivity.java

import android.content.Context; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.view.ViewPager; 
import android.support.design.widget.TabLayout; 
import android.os.Bundle; 

import java.util.Calendar; 

public class MainActivity extends FragmentActivity { 

    private static Context mContext; 

    private CachingFragmentStatePagerAdapter adapterViewPager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mContext = this; 

     ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager); 
     adapterViewPager = new MyPagerAdapter(getSupportFragmentManager()); 
     vpPager.setAdapter(adapterViewPager); 

     // set pager to current date 
     vpPager.setCurrentItem(TimeUtils.getPositionForDay(Calendar.getInstance())); 

     /** THIS IS WHERE THE ISSUES ARISE **/ 
     TabLayout tabLayoutDiary = (TabLayout) findViewById(R.id.diary_tabs); 
     tabLayoutDiary.setupWithViewPager(vpPager); 

    } 

    public static class MyPagerAdapter extends CachingFragmentStatePagerAdapter { 

     private Calendar cal; 

     public MyPagerAdapter(FragmentManager fragmentManager) { 
      super(fragmentManager); 
     } 

     @Override 
     public int getCount() { 
      return TimeUtils.DAYS_OF_TIME; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      long timeForPosition = TimeUtils.getDayForPosition(position).getTimeInMillis(); 
      return FragmentContent.newInstance(timeForPosition); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Calendar cal = TimeUtils.getDayForPosition(position); 
      return TimeUtils.getFormattedDate(mContext, cal.getTimeInMillis()); 
     } 


    } 

} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:fab="http://schemas.android.com/tools"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
     <android.support.design.widget.TabLayout 
      android:id="@+id/diary_tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabMode="scrollable"/> 
    </android.support.design.widget.AppBarLayout> 
    <android.support.v4.view.ViewPager 
     android:id="@+id/vpPager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

</android.support.design.widget.CoordinatorLayout> 

Répondre

2

Peut-être en raison de ce bug: https://code.google.com/p/android/issues/detail?id=180027

TabLayout crée un onglet TextView pour chaque page dans votre ViewPager, plutôt que de créer dynamiquement et le recyclage des TextViews. Comme vous le voyez, cela va juste exploser si vous essayez de faire croire à un ViewPager infini.

Malheureusement, il n'y a pas de solution pour le moment. Vous pouvez essayer d'utiliser https://github.com/nshmura/RecyclerTabLayout qui était lié au bogue, mais je ne l'ai pas utilisé moi-même.

+1

Merci pour la réponse! Implémenté dans RecyclerTabLayout avec succès. – user1301593