Невозможно обновить / обновить список в фрагменте из другого фрагмента в ViewPager

Мне трудно понять, что происходит дальше.

Что у меня есть: у меня есть 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 своими фрагментами в моем основном классе. После этого я собираюсь иметь полностью функциональный 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. Вы должны реализовать свой собственный слушатель, который поможет вам обмениваться данными между фрагментами через активность держателя. Это можно найти здесь: http://developer.android.com/training/basics/fragments/communicating.html . Очень просто и полезно.

  2. Вы должны получить фрагмент, который снова прост: извлечение фрагмента из ViewPager. Эти Q предлагают несколько приемлемых способов, я использовал решение SpareArray .

Спасибо за помощь в любом случае!

Вы должны иметь возможность получать свои фрагменты из своей деятельности, для этого вам нужно получить фрагмент из вашего адаптера, вам нужно будет добавить несколько методов к вашему адаптеру страницы

 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 создает тег для фрагментов, которые он делает.