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!
wo haben Sie deklariert und initialisiert ist isAdded() –
@ HRaval das ist eine eingebaute Funktion eines Fragments, das überprüft, ob es an eine Aktivität angehängt ist. –
versuchen Sie [this] (http://Stackoverflow.com/a/17629575/3117966), hoffe, es wird helfen – Nisarg