Używam ViewPagera zgodnego z wersją 4 w systemie Android. Moja FragmentActivity zawiera zbiór danych, które mają być wyświetlane na różne sposoby na różnych stronach w moim ViewPager. Do tej pory mam tylko 3 wystąpienia tego samego ListFragment, ale w przyszłości będę miał 3 wystąpienia różnych ListFragmentów. ViewPager znajduje się na pionowym ekranie telefonu, listy nie są obok siebie.
Teraz przycisk na ListFragment uruchamia oddzielne działanie na całej stronie (za pośrednictwem FragmentActivity), które zwraca, a FragmentActivity modyfikuje dane, zapisuje je, a następnie próbuje zaktualizować wszystkie widoki w swoim ViewPager. To tutaj utknąłem.
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;
}
...
Teraz, jak widać, moją pierwszą próbą było powiadomienieDataSetChanged na całym FragmentPagerAdapter, co pokazało, że czasami aktualizuje dane, ale w innych otrzymałem wyjątek IllegalStateException: nie można wykonać tej akcji po onSaveInstanceState.
Moja druga próba wywołała próbę wywołania funkcji aktualizacji w moim ListFragment, ale getId w getItem zwróciło 0. Zgodnie z dokumentacją, którą wypróbowałem
pozyskiwanie odniesienia do fragmentu z FragmentManager za pomocą findFragmentById () lub findFragmentByTag ()
ale nie znam tagu ani identyfikatora moich fragmentów! Mam android: id = "@ + id / viewpager" dla ViewPager i android: id = "@ android: id / list" dla mojego ListView w układzie ListFragment, ale nie sądzę, żeby były przydatne.
W jaki więc sposób mogę: a) bezpiecznie zaktualizować cały ViewPager za jednym razem (najlepiej przywracając użytkownika do strony, na której był wcześniej) - nie ma problemu, aby użytkownik zobaczył zmianę widoku. Lub najlepiej b) Wywołaj funkcję w każdym ListFragment, którego dotyczy problem, aby ręcznie zaktualizować ListView.
Każda pomoc zostanie przyjęta z wdzięcznością!
null
za fragment.