如何在TabLayout中更新Fragments?(使用ViewPager2和FragmentStateAdapter)

3

我使用来自Firebase的ArrayList中的数据创建初始内容,数据每15分钟更改一次,如何调用重新创建或如何从MainActivity设置文本到片段/如何更新片段中的TextView(其中任何一个都可以)

我已经阅读了很多人使用getItem解决此问题,但请记住我使用的是FragmentStateAdapter,我没有那些方法viewPager2.getAdapter().notifyDataSetChanged()没有任何作用

FragmentStateAdapter中可重写的方法

然后我想到了一个接口,只需更改我的TextView中的文本即可,但它总是会调用有关空指针的错误,因为我理解片段正在“暂停”,而我看不到它因为循环等等

调用viewPager2.setAdapter(new PagerAdapter())的重新创建仅在神明想要时有效吗? 我想要一些东西来强制它或者是可靠的

(老实说,我不知道为什么要像Google建议的那样使用最新的ViewPager2和PagerAdapter FragmentStateAdapter)我是否应该试试围绕ViewPager和所有这些旧工具的方式?


如果一个Fragment应该被更新,难道不应该是它自己监听变化吗? - ianhanniballake
1
你找到解决方案了吗? - rmdan
我遇到了同样的问题,找到的所有解决方法都没有起作用。你解决了吗? - Luke Galea
我感到非常惭愧,因为这么多个月以来我都没有回复其他人。简单来说,我将进程移动到了片段中。想象一下应用程序以蓝色打开,我将更改过程放在了Fragment.java而不是主类中。 - Antonio Obregon
2个回答

1
我遇到了这个问题,我的解决方案是:在适配器中使用弱引用保存片段实例,并在需要更新数据时调用片段中的方法。代码如下:
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 && wr.get() != null) {
                MyFragment fragment = wr.get();
                fragment.updateData(dataList.get(position));
            }
        }
    }
}

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

现在您可以在适配器上调用updateData(List dataList)来更新数据,并且代码中使用了WeakReference来避免内存泄漏。


1
根据文档,我们可以通过调用notifyDatasetChanged()来更新片段。因此,在Adapter中创建一个函数(setData),并在其中调用notifyDatasetChanged()可能会起作用..如下所示。
 fun addData(data: ArrayList<>) {
    mData = data
    notifyDataSetChanged()
    } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接