簡體   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