Невозможно обновить/обновить список в фрагменте из другого фрагмента в 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, чтобы обновить себя. Но я не уверен, что это хорошее решение, и нет лучшего способа, то есть просто освежить как-то весь фрагмент.

Решение

Хорошо, я думаю, что это была моя лень, но я решил это сейчас. Для всех, кто все еще хочет обновить фрагмент из другого или просто сделать связь между фрагментами, я расскажу вам о соответствующем подходе:

  • Вы должны реализовать свой собственный слушатель, который поможет вам обмениваться данными между фрагментами через активность держателя. Это можно найти здесь: http://developer.android.com/training/basics/fragments/communicating.html. Очень простой и полезный.

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

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

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