繁体   English   中英

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

[英]How to update Fragments in Tablayout? (Viewpager2, FragmentStateAdapter)

我使用来自 arraylist 的数据创建初始内容(我从 firebase 获取)数据每 15 分钟更改一次,我如何调用娱乐或如何将文本从 mainactivity 设置为片段/如何更新文本视图碎片(其中任何一个都可以)

我读过很多人用 getItem 解决这个问题,但请记住我有 FragmentStateAdapter 我没有这些方法 viewPager2.getAdapter().notifyDataSetChanged() 什么都不做

FragmentStateAdapter 中的可重写方法

然后我认为一个界面只是为了更改我的文本视图中的文本,但它总是调用一个关于空指针的错误,因为我知道片段正在“暂停”,而我没有看到它,因为循环等等所以

调用 viewPager2.setAdapter(new PagerAdapter() 的娱乐,但只有在上帝想要的时候才有效?我想要一些东西来强制它或可靠

(老实说,我不再知道为什么要按照 Google 的建议使用最新的 viewpager2 和 PagerAdapter FragmentStateAdapter)我应该尝试使用 viewpager 和所有那些旧工具吗?

根据Doc ,我们可以通过调用 notifyDatasetChanged() 来更新片段,因此通过在 Adapter 中创建一个函数(setData) 并在其中调用 notifyDatasetChanged() 可以工作..如下所示

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

我遇到了这个问题,我的解决方法是:在adapter中使用WeakReference保存fragment实例,在需要更新数据时调用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 && wr.get() != null) {
                MyFragment fragment = wr.get();
                fragment.updateData(dataList.get(position));
            }
        }
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM