首页 > 解决方案 > 如何更新 ViewPager 适配器/FragmentStateAdapter?

问题描述

如何更新我发送到 Fragment 以显示在 RecycleReview 中的数据?并更改 UI

当我使用 swipeRefreshlayout 时,数据将来自 Room 并发送到 Adapter 和 notifyDataSetChange

但 notifyDataSetChange 不起作用,我的适配器未更新

这是我显示 viewPager 的主要片段

        if (fragmentHomeBinding.viewPager2.getAdapter() == null){
        Log.e("TAG", "setupTablayoutTapGainLose: tab setAdapter");
        topGainLosersAdapter = new TopGainLosersAdapter(this,allMarketModel);
        fragmentHomeBinding.viewPager2.setAdapter(topGainLosersAdapter);
    }else {
        Log.e("TAG", "setupTablayoutTapGainLose: tab notify");
        topGainLosersAdapter = (TopGainLosersAdapter) fragmentHomeBinding.viewPager2.getAdapter();
        topGainLosersAdapter.updateData(allMarketModel);
    }

这是我的 viewPager 适配器

public class TopGainLosersAdapter extends FragmentStateAdapter {
AllMarketModel allMarketModel;

public TopGainLosersAdapter(@NonNull @NotNull Fragment fragment, AllMarketModel allMarketModel) {
    super(fragment);
    this.allMarketModel = allMarketModel;

}


@NonNull
@NotNull
@Override
public Fragment createFragment(int position) {
    // Return a NEW fragment instance in createFragment(int)
    Fragment fragment = new TopGainLoseFrag();
    Bundle args = new Bundle();
    // Our object is just an integer :-P
    args.putInt("pos", position);
    args.putParcelable("data",allMarketModel);
    fragment.setArguments(args);
    return fragment;

}

@Override
public int getItemCount() {
    return 2;
}


public void updateData(AllMarketModel newdata) {
    allMarketModel = newdata;
    notifyDataSetChanged();
}

}

这是我展示 recyclerView 的片段

public class TopGainLoseFrag extends Fragment {

FragmentTopGainLoseBinding fragmentTopGainLoseBinding;
GainLoseRvAdapter gainLoseRvAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    fragmentTopGainLoseBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_top_gain_lose,container,false);

    // Inflate the layout for this fragment
    return fragmentTopGainLoseBinding.getRoot();
}

@Override
public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    //get data from viewPager2 adapter as bundle
    Bundle args = getArguments();
    int pos = args.getInt("pos");
    AllMarketModel allMarketModel = args.getParcelable("data");

    setupRecyclerView(allMarketModel.getData(),pos);

}

private void setupRecyclerView(List<DataItem> data, int pos) {

    // sort Model list by change percent (lowest to highest)
    Collections.sort(data, new Comparator<DataItem>() {
        @Override
        public int compare(DataItem o1, DataItem o2) {
            return Integer.valueOf((int) o1.getQuote().getUSD().getPercentChange24h()).compareTo(Integer.valueOf((int) o2.getQuote().getUSD().getPercentChange24h()));
        }
    });

    ArrayList<DataItem> dataItems = new ArrayList<>();
    //if page was top Gainers
    if (pos == 0){
        //get 10 last Item
        for (int i = 0;i < 10;i++){
            dataItems.add(data.get(data.size() - 1 - i));
            Log.e("TAG",data.get(data.size() - 1 - i).getSymbol() + " : " + data.get(data.size() - 1 - i).getQuote().getUSD().getPrice());
        }

        //if page was top Losers
    }else if (pos == 1){
        //get 10 first Item
        for (int i = 0;i < 10;i++){
            dataItems.add(data.get(i));
        }
    }
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    fragmentTopGainLoseBinding.gainLoseRv.setLayoutManager(linearLayoutManager);

    if (fragmentTopGainLoseBinding.gainLoseRv.getAdapter() == null){
        Log.e("TAG", "setupRecyclerView: setAdapter");
        gainLoseRvAdapter = new GainLoseRvAdapter(dataItems);
        fragmentTopGainLoseBinding.gainLoseRv.setAdapter(gainLoseRvAdapter);
    }else {
        Log.e("TAG", "setupRecyclerView: notify");
        gainLoseRvAdapter = (GainLoseRvAdapter) fragmentTopGainLoseBinding.gainLoseRv.getAdapter();
        gainLoseRvAdapter.updateData(dataItems);
    }
}

}

标签: androidandroid-fragmentsnotifydatasetchangedandroid-viewpager2fragmentstateadapter

解决方案


推荐阅读