2

Ich habe einen infinite ViewPager in situ implementiert https://github.com/JoachimR/AnyDayViewPager. Anstatt jedoch einen PagerTabStrip zu verwenden, würde ich lieber ein CoordinatorLayout mit TabLayout verwenden. Aber wenn ich das TabLayout mit dem viewpager aufstelle (ich gehe davon aus, dass es eine "unendliche Anzahl von ViewPager-Fragmenten" gibt), bleibt die App hängen.Infinite ViewPager mit TabLayout

Wie kann ich dieses Problem lösen?

Hier ist der Code (die anderen Dateien, die ich nicht geändert haben, können bei JoachimR/AnyDayViewPager gefunden werden, zum Beispiel FragmentContent.java, CachingFragmentStatePagerAdapter.java, TimeUtils.java usw.)

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> 

Antwort

2

Möglicherweise aufgrund dieses Fehlers: https://code.google.com/p/android/issues/detail?id=180027

TabLayout erstellt einen Textview-Registerkarte für jede Seite in Ihrem ViewPager, anstatt dynamisch erstellen und die Textviews Recycling. Wie Sie sehen, wird dies nur explodieren, wenn Sie versuchen, einen unbegrenzten ViewPager zu fälschen.

Leider gibt es keine Lösung für jetzt. Sie können versuchen, https://github.com/nshmura/RecyclerTabLayout verwenden, die auf den Fehler verknüpft war, aber ich habe es nicht selbst verwendet.

+1

Danke für die Antwort! Erfolgreich in RecyclerTabLayout implementiert. – user1301593

Verwandte Themen