#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, чтобы избежать утечки памяти в коде.