Я использую v4 совместимость ViewPager в Android. У моей FragmentActivity есть куча данных, которые должны отображаться по-разному на разных страницах моего ViewPager. Пока у меня есть только 3 экземпляра одного и того же списка, но в будущем у меня будет 3 экземпляра разных ListFragments. ViewPager находится на вертикальном экране телефона, списки не бок о бок.
Теперь кнопка в ListFragment запускает отдельную полностраничную активность (через FragmentActivity), которая возвращается, а FragmentActivity изменяет данные, сохраняет их, а затем пытается обновить все представления в своем ViewPager. Именно здесь, где я застрял.
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;
}
...
Теперь, как вы можете видеть, моя первая попытка состояла в том, чтобы notifyDataSetChanged на всем FragmentPagerAdapter, и это показывало, чтобы иногда обновлять данные, а другие я получил исключение IllegalStateException: не удалось выполнить это действие после onSaveInstanceState.
Моя вторая попытка заключалась в попытке вызвать функцию обновления в моем ListFragment, но getId в getItem был возвращен 0. В соответствии с документами, которые я пробовал
получить ссылку на фрагмент из FragmentManager, используя findFragmentById() или findFragmentByTag()
но я не знаю тега или идентификатора моих фрагментов! У меня есть android: id = "@+ id/viewpager" для ViewPager и android: id = "@android: id/list" для моего ListView в макете ListFragment, но я не думаю, что они полезны.
Итак, как я могу: a) безопасно обновить весь ViewPager за один раз (в идеале, вернуть пользователя на страницу, на которой он был раньше) - это нормально, что пользователь видит изменение вида. Или предпочтительно, б) вызвать функцию в каждом затронутом списке ListFragment, чтобы обновить ListView вручную.
Любая помощь будет с благодарностью принята!