Как обновить фрагменты в Tablayout? (Viewpager2, FragmentStateAdapter)

#android #android-fragments #android-tablayout #android-viewpager2 #fragmentstateadapter

#Android #android-фрагменты #android-tablayout #android-viewpager2 #fragmentstateadapter

Вопрос:

Я создаю начальный контент с данными из arraylist (я получаю его из firebase), данные меняются каждые 15 минут, как мне вызвать воссоздание или как мне установить текст из mainactivity во фрагменты / как мне обновить текстовые представления во фрагментах (любой из них будет работать, пожалуйста)

я прочитал множество людей, решающих эту проблему с помощью GetItem, но помните, что у меня есть FragmentStateAdapter у меня нет этих методов ViewPager2.getAdapter().notifyDataSetChanged() ничего не делает

Переопределяемые методы в FragmentStateAdapter

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

Вызов воссоздания ViewPager2.setAdapter(new PagerAdapter() работает, но только когда этого хотят боги? и я хочу, чтобы что-то заставляло его или было перезаписываемым

(Искренне я больше не знаю, почему я использую новейшие viewpager2 и PagerAdapter FragmentStateAdapter, как предлагает Google) должен ли я попробовать обойти viewpager и все эти старые инструменты?

Комментарии:

1. Если фрагмент должен быть обновлен, разве он не должен прослушивать изменения?

2. Вы нашли решение для этого?

3. Я сталкиваюсь с той же проблемой, и все решения, которые я нашел, не сработали. Вам удалось это исправить?

4. мне так стыдно, что после всех этих месяцев я тоже не ответил другим парням. Короткий ответ, я перенес процесс на фрагменты. Представьте, что приложение открывается синим цветом, и я помещаю процессы изменения в Fragment.java вместо основного класса

Ответ №1:

Согласно документу, мы можем обновить фрагмент, вызвав notifyDataSetChanged(), создав функцию (setData) в адаптере и внутри которой вызов notifyDataSetChanged() может работать .. как показано ниже

  fun addData(data: ArrayList<>) {
    mData = data
    notifyDataSetChanged()
    } 
  

Ответ №2:

Я столкнулся с этой проблемой, мое решение таково: сохраните экземпляр фрагмента, используя WeakReference в адаптере, и вызовите метод во fragment при необходимости обновить его данные. Код выглядит следующим образом:

 public MyAdapter extends FragmentStateAdapter{
    private Map<Integer, WeakReference<MyFragment>> fragmentMap = new HashMap();

    @Override
    public Fragment createFragment(int position) {
        MyFragment fragment=new MyFragment();
        fragmentMap.put(position, new WeakReference<>(fragment));
        return fragment;
    }

    public void updateData(List<String> dataList){
        for (int position : fragmentMap.keySet()) {
            WeakReference<MyFragment> wr = fragmentMap.get(position);
            if (wr != null amp;amp; wr.get() != null) {
                MyFragment fragment = wr.get();
                fragment.updateData(dataList.get(position));
            }
        }
    }
}

public MyFragment extends Fragment{
    public void updateData(String data){
        ...
    }
}
  

Теперь вы можете вызвать updateData (список данных) на вашем адаптере для обновления данных, и он использует WeakReference, чтобы избежать утечки памяти в коде.