2

Ich habe 4 Fragmente in einem ViewPager, der mit einem TabLayout integriert ist. Jedes dieser Fragmente enthält eine RecyclerView, weil ich eine unbekannte Menge an Listenelementen zeige. Die Elemente werden nach Datum geladen, daher habe ich zwei Schaltflächen, mit denen Sie Tage ändern können. Anschließend werden die entsprechenden Daten in den Listenelementen basierend auf dem festgelegten Datum geladen. Die Schaltflächen sind Teil der äußeren Aktivität.Fragment in ViewPager zeigt nichts in seinem RecyclerView bei Rotation an

Alles funktioniert soweit perfekt ABER sobald ich das Gerät rotiere, laden die Fragmente nichts. In den Fragmenten wird nichts angezeigt. Die Ansichten in der äußeren Aktivität werden jedoch gut angezeigt. Das Seltsame ist, dass wenn ich eine der Schaltflächen berühre, die das Datum ändern, die Fragmente geladen werden und die Daten korrekt angezeigt werden. Aber ich brauche alles sofort nach der Rotation angezeigt zu werden, nicht nur, wenn ich auf einen dieser Knöpfe klicke. Hier ist mein Code:

public class MainActivity extends AppCompatActivity implements DatePickerFragment.DateDialogInterface 
{ 
    private final static String COLOR_CONTROL_CHOSEN = "color_control_chosen"; 
    private static final String DIALOG_DATE = "dialog_date"; 
    private static final String TAG = "MainActivity"; 
    private static final String SET_LOCATION = "set_location"; 
    public static final String LEAGUE_POSITION = "league_position"; 
    private Toolbar mToolbar; 
    private ViewPager mViewPager; 
    private TabLayout mTabLayout; 
    private ImageButton mPrevDateButton, mNextDateButton; 
    private TextView mDateTextView, mLeagueTextView; 
    private String mTodaysDate; 
    private Date mLastSelectedDate, mTodaysDateObj; 
    private ProgressBar mProgressBar; 
    private FragmentPagerAdapter mAdapterViewPager; 

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

     mToolbar = (Toolbar) findViewById(R.id.outnix_toolbar); 
     mViewPager = (ViewPager) findViewById(R.id.main_activity_view_pager); 
     mTabLayout = (TabLayout) findViewById(R.id.main_activity_tab_layout); 
     mDateTextView = (TextView) findViewById(R.id.display_date_text_view); 
     mLeagueTextView = (TextView) findViewById(R.id.league_title_header); 
     mPrevDateButton = (ImageButton) findViewById(R.id.previous_date_button); 
     mNextDateButton = (ImageButton) findViewById(R.id.next_date_button); 
     mProgressBar = (ProgressBar) findViewById(R.id.loading_circle); 
     mProgressBar.setVisibility(View.GONE); 
     setTodaysDate(); 
     mDateTextView.setText("Today"); 

     setSupportActionBar(mToolbar); 
     assert getSupportActionBar() != null; 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     NavDrawerFragment navDrawerFrag = (NavDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_nav_drawer); 
     navDrawerFrag.setUp((DrawerLayout) findViewById(R.id.nav_drawer), mToolbar); 

     setUpViewPagerAdapterOnCreate(); 
     mTabLayout.setupWithViewPager(mViewPager); 

     mDateTextView.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       FragmentManager fm = getSupportFragmentManager(); 
       DatePickerFragment dialog = new DatePickerFragment(); 
       Bundle args = new Bundle(); 
       args.putSerializable("ARG_DATE", mLastSelectedDate); 
       dialog.setArguments(args); 
       dialog.show(fm, DIALOG_DATE); 
      } 
     }); 

    THESE TWO LISTENERS ARE WHAT DISPLAY THE DATA AFTER A ROTATION CHANGE 
    ////////////////////////////////////////////////////////////////// 
     mPrevDateButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       mProgressBar.setVisibility(View.VISIBLE); 
       updateDate(-1); 
       setupViewPagerAdapter(getViewPagerPos()); 
      } 
     }); 

     mNextDateButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       mProgressBar.setVisibility(View.VISIBLE); 
       updateDate(1); 
       setupViewPagerAdapter(getViewPagerPos()); 
      } 
     }); 
    } 
    //////////////////////////////////////////////////////////////////// 
/* @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     setupViewPagerAdapter(getViewPagerPos()); 
    }*/ 

    private void setUpViewPagerAdapterOnCreate() //only called when opened from LauncherActivity 
    { 
     setupViewPagerAdapter(0); 

     int touchColorPixel = getIntent().getIntExtra(COLOR_CONTROL_CHOSEN, ContextCompat.getColor(this, R.color.blue)); 

     if(touchColorPixel == ContextCompat.getColor(this, R.color.orange)) 
      mViewPager.setCurrentItem(0); 
     else if(touchColorPixel == ContextCompat.getColor(this, R.color.blue)) 
      mViewPager.setCurrentItem(1); 
     else 
      mViewPager.setCurrentItem(3); 
    } 

    private void setupViewPagerAdapter(int currentPos) 
    { 
     mAdapterViewPager = new MainPagerAdapter(getSupportFragmentManager()); 

     mViewPager.setAdapter(mAdapterViewPager); 
     mViewPager.setOffscreenPageLimit(4); 
     mViewPager.setCurrentItem(currentPos); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     outState.putSerializable(DIALOG_DATE, mLastSelectedDate);   //save the last date selected (or last date displayed) on rotation change. 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) 
    { 
     super.onRestoreInstanceState(savedInstanceState); 
     setDateFromDialog((Date) savedInstanceState.getSerializable(DIALOG_DATE)); //restore the last date selected to the new rotation change 
    } 

    public ProgressBar getProgressBar() 
    { 
     return mProgressBar; 
    } 

    @Override 
    public void setDateFromDialog(Date date) 
    { 
     String newDate = getFormattedDate(date); 
     updateTodaysDate();  
     mLastSelectedDate = date; 

     setupViewPagerAdapter(getViewPagerPos()); 

     if(newDate.equals(mTodaysDate)) 
      mDateTextView.setText("Today"); 
     else 
      mDateTextView.setText(newDate); 
    } 

    private int getViewPagerPos() 
    { 
     return mViewPager.getCurrentItem(); 
    } 
} 

Die 2 Tasten mPrevDateButton und mNextDateButton sind die Tasten, die beim Anklicken das Problem „reparieren“. Innerhalb ihrer Klick-Listener führt die updateDate() Methode nur Sachen aus, die sich auf ein TextView-Objekt beziehen, und deshalb habe ich die Definitionen nicht eingeschlossen (ich versuche, den Beitrag so kurz wie möglich zu halten). Ich weiß also sicher, dass es etwas mit meiner setupViewPagerAdapter() Methode zu tun hat. Ich habe versucht, diese Methode in onCreate() und onResume() hinzuzufügen, aber die Fragmente bleiben immer noch leer.

Hier ist mein ViewPager Adaptercode:

public class MainPagerAdapter extends FragmentPagerAdapter 
{ 
    private final String[] mFragmentTitleList = {"My Games", "All Games", "All Places", "My Places"}; //tab title names 
    private final static int NUM_FRAGMENTS = 4; 

    public MainPagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     switch(position) 
     { 
      case 0: 
       return MyGamesFragment.newInstance(); 
      case 1: 
       return AllGamesFragment.newInstance(); 
      case 2: 
       return AllPlacesFragment.newInstance(); 
      case 3: 
       return MyPlacesFragment.newInstance(); 
      default: 
       return null; 
     } 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) 
    { 
     return mFragmentTitleList[position]; 
    } 
} 

Hier ist eine der vier Fragmente. Sie haben fast alle ein ähnliches Design.

Ich habe so viele Beiträge hier angesehen, meinen Code viele Male geändert und ich kann es immer noch nicht zur Arbeit bringen. Ich bin nur verblüfft, dass es "repariert", wenn ich auf eine der Datumsschaltflächen klicke. Wenn Sie möchten, dass ich mehr Code von etwas poste, lassen Sie es mich wissen. Sorry für die lange Post, aber ich fühle, dass der Kontext benötigt wird. Ich schätze jede Hilfe!

+0

wo haben Sie deklariert und initialisiert ist isAdded() –

+0

@ HRaval das ist eine eingebaute Funktion eines Fragments, das überprüft, ob es an eine Aktivität angehängt ist. –

+0

versuchen Sie [this] (http://Stackoverflow.com/a/17629575/3117966), hoffe, es wird helfen – Nisarg

Antwort

3

Ich habe es herausgefunden! Ich musste zu einem FragmentStatePagerAdapter anstatt zu einem FragmentPagerAdapter wechseln. Ich glaube, es hat etwas damit zu tun, dass die Fragmente wieder zerstört und neu erschaffen werden.

Ich habe auch gelesen, dass ein anderer Weg, um die ViewPager in einem Fragment wickeln würde und wenn man seinen Adapter Sie getChildFragmentManager() verwenden erstellen, anstatt getSupportFragmentManager() wie folgt aus:

mAdapterViewPager = new MyPagerAdapter(getChildFragmentManager()); 

ich nicht hinzufügen haben wollte ein ganzes Fragment um meinen ViewPager, nur um dieses Problem zu beheben, also wechselte ich zu FragmentStatePagerAdapter und es funktionierte! Hoffe, das hilft jemand anderem da draußen.

0

makeingPager adapter erweitert FragmentStatePagerAdapter und nicht FragmentPagerAdapter sollte das Problem lösen.

+0

Willkommen bei SO. Dies sollte ein Kommentar sein, eine Antwort nicht. –