Невозможно обновить/обновить список в фрагменте из другого фрагмента в ViewPager
Мне сложно разобраться в следующем.
Что у меня: У меня есть просмотрщик и несколько страниц. В этом вопросе важны только два из них, назовем их Fragment1 и Fragment2, и они находятся рядом друг с другом. Fragment1 содержит список, заполненный данными из Интернета (внешняя база данных). Фрагмент2 содержит простую кнопку.
Моя цель:. Если я нажму кнопку Fragment2, я добавлю новый элемент во внешнюю базу данных. Я хотел бы обновить/обновить список в Fragment1 с помощью этого нового элемента.
notifyDataChanged()
не работает в моем случае, однако до сих пор я был уверен, что он восстанавливает все страницы. Я собираюсь представить свою проблему самым ясным способом, поэтому я могу видеть код, который у меня есть, это мой ViewPager
:
class MyPagerAdapter extends FragmentStatePagerAdapter {
public List<String> fragmentsA;
public MyPagerAdapter(FragmentManager fm) {
super(fm);
fragmentsA = fragments;
}
@Override
public Fragment getItem(int position) {
return Fragment.instantiate(context, fragmentsA.get(position));
}
@Override
public CharSequence getPageTitle(int position) {
return mEntries.get(position % CONTENT.length).toUpperCase();
}
@Override
public int getCount() {
return mEntries.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
Fragment1 onCreateView() (в ближайшее время):
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
getData();
View view = inflater.inflate(R.layout.latestapps_tab, container, false);
lw = (ListView) view.findViewById(R.id.lw);
context = getActivity().getApplicationContext();
act = this.getActivity();
m_adapter = new ItemAdapter();
lw.setAdapter(m_adapter);
return view;
}
Я создаю ViewPager
и адаптер, я устанавливаю адаптер для ViewPager
, после чего я заполняю свой просмотрщик моими фрагментами в моем основном классе. После этого я собираюсь иметь полностью функциональный ViewPager с 2 фрагментами.
pager = (ViewPager)findViewById( R.id.viewpager );
adapter = new MyPagerAdapter(getSupportFragmentManager());
indicator = (TabPageIndicator)findViewById( R.id.indicator );
pager.setAdapter( adapter );
indicator.setViewPager( pager );
pager.setCurrentItem(INITIAL_PAGE);
pager.setOffscreenPageLimit(3);
//adding fragments to the pager
fragments.add( Fragment1.class.getName());
fragments.add( Fragment2.class.getName());
В Fragment1 у меня есть listview с некоторыми текстовыми комментариями в каждом элементе списка. Загрузка отлично работает: я создаю ArrayLists
, и я заполняю списки с данными из внешней базы данных. После того, как загрузка завершена, я заполняю списки с этими тоннами данных.
В Fragment 2 я нажимаю кнопку, и мне бы хотелось, чтобы этот список был обновлен, поэтому в списке можно создать новую строку с некоторыми данными из внешней базы данных. (конечно, запись в базу данных работает)
Мое предположение, что я не могу обновить ArrayLists или я не буду восстанавливать Fragment1, поэтому метод getDataFromSQL() никогда не будет работать, только если я выйду и запустим приложение снова, или я так сильно провёл в ViewPager, что Fragment1 отделится, Поэтому я не могу обновить или обновить Fragment1. Может ли кто-нибудь помочь в этом вопросе?
ИЗМЕНИТЬ
Мне удалось сделать это с доставкой сообщения для фрагмента2, чтобы обновить себя. Но я не уверен, что это хорошее решение, и нет лучшего способа, то есть просто освежить как-то весь фрагмент.
Решение
Хорошо, я думаю, что это была моя лень, но я решил это сейчас. Для всех, кто все еще хочет обновить фрагмент из другого или просто сделать связь между фрагментами, я расскажу вам о соответствующем подходе:
Спасибо за помощь в любом случае!
Ответы
Ответ 1
вам нужно получить свои фрагменты из своей деятельности, чтобы сделать это, чтобы получить фрагмент из вашего адаптера, вам нужно добавить несколько методов к вашему адаптеру страницы
public Fragment getFragment(ViewPager container, int position, FragmentManager fm) {
String name = makeFragmentName(container.getId(), position);
return fm.findFragmentByTag(name);
}
private String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
то из вашей активности сделайте следующий метод
public Fragment getFragmentbyPosition(int position) {
return adapter.getFragment(pager, position, getSupportFragmentManager());
}
теперь на фрагменте2 вызовите следующее:
Fragment1 fragment1 = (Fragment1) ((MyActivity)getActivity()).getFragmentbyPosition(0);
теперь вы сможете вызывать общедоступные методы для фрагмента 1 из фрагмента 2, поэтому просто используйте это в своем onClick и скажите фрагменту1 обновить его listview.
теперь причиной makeFragmentName является то, что FragmentPagerAdapter создает тег для фрагментов, которые он делает.