Ich verwende den v4-Kompatibilitäts-ViewPager in Android. Meine FragmentActivity enthält eine Reihe von Daten, die auf verschiedenen Seiten in meinem ViewPager auf unterschiedliche Weise angezeigt werden sollen. Bisher habe ich nur 3 Instanzen desselben ListFragments, aber in Zukunft werde ich 3 Instanzen verschiedener ListFragments haben. Der ViewPager befindet sich auf einem vertikalen Telefonbildschirm. Die Listen werden nicht nebeneinander angezeigt.
Jetzt startet eine Schaltfläche im ListFragment eine separate ganzseitige Aktivität (über die FragmentActivity), die zurückgibt und FragmentActivity die Daten ändert, speichert und dann versucht, alle Ansichten in ihrem ViewPager zu aktualisieren. Hier stecke ich fest.
public class ProgressMainActivity extends FragmentActivity
{
MyAdapter mAdapter;
ViewPager mPager;
@Override
public void onCreate(Bundle savedInstanceState)
{
...
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.viewpager);
mPager.setAdapter(mAdapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
...
updateFragments();
...
}
public void updateFragments()
{
//Attempt 1:
//mAdapter.notifyDataSetChanged();
//mPager.setAdapter(mAdapter);
//Attempt 2:
//HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentById(mAdapter.fragId[0]);
//fragment.updateDisplay();
}
public static class MyAdapter extends FragmentPagerAdapter implements
TitleProvider
{
int[] fragId = {0,0,0,0,0};
public MyAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public String getTitle(int position){
return titles[position];
}
@Override
public int getCount(){
return titles.length;
}
@Override
public Fragment getItem(int position)
{
Fragment frag = HomeListFragment.newInstance(position);
//Attempt 2:
//fragId[position] = frag.getId();
return frag;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE; //To make notifyDataSetChanged() do something
}
}
public class HomeListFragment extends ListFragment
{
...
public static HomeListFragment newInstance(int num)
{
HomeListFragment f = new HomeListFragment();
...
return f;
}
...
Wie Sie sehen können, bestand mein erster Versuch darin, DataSetChanged für den gesamten FragmentPagerAdapter zu benachrichtigen. Dies zeigte, dass die Daten manchmal aktualisiert wurden. Bei anderen wurde jedoch eine IllegalStateException angezeigt: Diese Aktion kann nach onSaveInstanceState nicht ausgeführt werden.
Bei meinem zweiten Versuch habe ich versucht, eine Aktualisierungsfunktion in meinem ListFragment aufzurufen, aber getId in getItem hat 0 zurückgegeben. Gemäß den Dokumenten, die ich ausprobiert habe
Abrufen eines Verweises auf das Fragment von FragmentManager mithilfe von findFragmentById () oder findFragmentByTag ()
aber ich kenne das Tag oder die ID meiner Fragmente nicht! Ich habe ein android: id = "@ + id / viewpager" für ViewPager und ein android: id = "@ android: id / list" für meine ListView im ListFragment-Layout, aber ich denke nicht, dass diese nützlich sind.
Wie kann ich also entweder: a) den gesamten ViewPager auf einmal sicher aktualisieren (idealerweise den Benutzer auf die Seite zurückbringen, auf der er zuvor war) - es ist in Ordnung, dass der Benutzer die Ansichtsänderung sieht. Oder vorzugsweise b) eine Funktion in jedem betroffenen ListFragment aufrufen, um die ListView manuell zu aktualisieren.
Jede Hilfe wäre dankbar!
null
Fragmente.