J'utilise la compatibilité v4 ViewPager sous Android. Mon FragmentActivity a un tas de données qui doivent être affichées de différentes manières sur différentes pages de mon ViewPager. Jusqu'à présent, je n'ai que 3 instances du même ListFragment, mais à l'avenir j'aurai 3 instances de ListFragments différents. Le ViewPager est sur un écran de téléphone vertical, les listes ne sont pas côte à côte.
Maintenant, un bouton sur le ListFragment démarre une activité pleine page distincte (via FragmentActivity), qui retourne et FragmentActivity modifie les données, les enregistre, puis tente de mettre à jour toutes les vues dans son ViewPager. C'est ici, où je suis coincé.
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;
}
...
Maintenant, comme vous pouvez le voir, ma première tentative a été de notifierDataSetChanged sur l'ensemble du FragmentPagerAdapter, et cela a montré qu'il fallait parfois mettre à jour les données, mais d'autres j'ai eu une IllegalStateException: impossible d'effectuer cette action après onSaveInstanceState.
Ma deuxième tentative consistait à essayer d'appeler une fonction de mise à jour dans mon ListFragment, mais getId dans getItem a renvoyé 0. Selon les documents que j'ai essayés par
acquérir une référence au Fragment à partir de FragmentManager, en utilisant findFragmentById () ou findFragmentByTag ()
mais je ne connais pas la balise ou l'identifiant de mes fragments! J'ai un android: id = "@ + id / viewpager" pour ViewPager, et un android: id = "@ android: id / list" pour mon ListView dans la mise en page ListFragment, mais je ne pense pas que ceux-ci soient utiles.
Alors, comment puis-je: a) mettre à jour l'intégralité du ViewPager en toute sécurité en une seule fois (idéalement en renvoyant l'utilisateur à la page sur laquelle il se trouvait auparavant) - il est normal que l'utilisateur voit la vue changer. Ou de préférence, b) appelez une fonction dans chaque ListFragment affecté pour mettre à jour le ListView manuellement.
Toute aide serait acceptée avec gratitude!
null
fragment.