如何更新Tablayout中的片段?(Viewpager2,FragmentStateAdapter)

hzbexzde  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(236)

我用数组列表中的数据创建初始内容(我从firebase中获得),数据每15分钟更改一次,我如何调用重新创建,或者我如何将主活动中的文本设置到片段中/我如何更新片段中的文本视图(请选择任何一种方法)
我读过很多人用getItem解决这个问题,但是请记住,我有FragmentStateAdapter,我没有这些方法viewPager2.getAdapter().notifyDataSetChanged()什么也不做
Overridable Methods in FragmentStateAdapter
然后我想到了一个接口如何改变我的文本视图中的文本,但它总是调用一个关于空指针的错误,因为我知道片段被“暂停”,而我没有看到它,因为循环等等
调用viewPager2.setAdapter(new PagerAdapter())的重新创建可以工作,但只有在神想要的时候,我才需要强制执行它或使它可靠
(我真的不知道为什么我要像谷歌建议的那样使用最新的viewpager 2和PagerAdapter FragmentStateAdapter)我应该尝试一下viewpager和所有那些旧工具吗?

pes8fvy9

pes8fvy91#

根据文档,我们可以通过调用notifyDatasetChanged()来更新片段,因此可以在适配器中创建一个函数(setData),在该函数中调用notifyDatasetChanged()可能会起作用..如下所示

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

11dmarpk2#

我遇到了这个问题,我的解决办法是:使用适配器中的WeakReference保存片段示例,当需要更新片段中的数据时,调用片段中的方法,代码如下:

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来避免代码中的内存泄漏。

相关问题