You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中ViewPager2多Tab列表数据同步更新问题求助

问题解决:订单状态更新后实时刷新所有Tab列表

你的场景是:Dashboard Activity底部导航的ALL order菜单内,TabLayout搭配ViewPager2实现多Tab页面,每个Tab对应一个带RecyclerView的Fragment。点击列表项的按钮修改订单状态后,当前列表已能移除该项,但其他Tab的列表不会自动刷新,只有重新回到Activity才会显示更新后的数据。需要实现状态修改成功后,所有Tab的Fragment自动重新拉取数据。

解决方案步骤

1. 修复子Fragment的fetchData()方法

当前fetchData()仅追加数据,刷新时会重复旧数据,需先清空列表再加载新数据,同时优化Adapter的创建逻辑:

public void fetchData(){
    ApiService apiService = getRetrofitInstance().create(ApiService.class);
    Call<List<InProgressOrderData>> call = apiService.getPendingOrder();
    call.enqueue(new Callback<List<InProgressOrderData>>() {
        @Override
        public void onResponse(Call<List<InProgressOrderData>> call, Response<List<InProgressOrderData>> response) {
            if (response.isSuccessful()){
                // 先清空旧数据,避免重复
                progressDataList.clear();
                progressDataList.addAll(response.body());
                // 已存在Adapter则直接通知数据变化,无需重建
                if(recyclerView.getAdapter() != null){
                    recyclerView.getAdapter().notifyDataSetChanged();
                } else {
                    InProgressAdapter inProgressAdapter = new InProgressAdapter(getContext(),progressDataList, InProgress.this);
                    recyclerView.setAdapter(inProgressAdapter);
                }
            }
            else{
                Toast.makeText(getContext(), "Error..", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<List<InProgressOrderData>> call, Throwable t) {
            Toast.makeText(getContext(), "Failed..", Toast.LENGTH_SHORT).show();
        }
    });
}

注意:所有子Fragment(NewOrder、Dispatched、Completed、Cancelled)的fetchData()都要做同样修改。

2. 在AllOrderFragment中定义全局刷新逻辑

修改AllOrderFragment,保存子Fragment引用并实现全局刷新触发机制:

public class AllOrderFragment extends Fragment {

    public AllOrderFragment() {
        // Required empty public constructor
    }

    View view;
    TabLayout tab;
    ViewPager2 viewPager2;
    ViewPagerAdapter viewPagerAdapter;
    // 保存已加载的子Fragment引用
    private final HashMap<Integer, Fragment> fragmentMap = new HashMap<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_all_order,container,false);
        myToolbar();
        tab = view.findViewById(R.id.tab);
        viewPager2 = view.findViewById(R.id.viewPager2);
        viewPagerAdapter = new ViewPagerAdapter(getActivity());
        viewPager2.setAdapter(viewPagerAdapter);

        // 监听页面切换,保存Fragment引用
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                Fragment fragment = viewPagerAdapter.createFragment(position);
                fragmentMap.put(position, fragment);
            }
        });

        TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tab, viewPager2, (tab, position) -> {
            switch (position){
                case 0: tab.setText("NewOrder"); break;
                case 1: tab.setText("InProgress"); break;
                case 2: tab.setText("Dispatched"); break;
                case 3: tab.setText("Completed"); break;
                case 4: tab.setText("Cancelled"); break;
            }
        });
        tabLayoutMediator.attach();
        return view;
    }

    // 触发所有子Fragment刷新数据
    public void triggerAllTabsRefresh(){
        for(Fragment fragment : fragmentMap.values()){
            if(fragment instanceof NewOrder){
                ((NewOrder) fragment).fetchData();
            } else if(fragment instanceof InProgress){
                ((InProgress) fragment).fetchData();
            } else if(fragment instanceof Dispatched){
                ((Dispatched) fragment).fetchData();
            } else if(fragment instanceof Completed){
                ((Completed) fragment).fetchData();
            } else if(fragment instanceof Cancelled){
                ((Cancelled) fragment).fetchData();
            }
        }
    }

    public void myToolbar(){
        Toolbar toolbar = view.findViewById(R.id.toolbarOrder);
        AppCompatActivity activity = (AppCompatActivity) getActivity();
        if (activity != null) {
            activity.setSupportActionBar(toolbar);
            ActionBar actionBar = activity.getSupportActionBar();
            if (actionBar != null) {
                actionBar.setTitle("Orders");
                toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));
            }
        }
    }
}

3. 在订单状态修改成功后触发全局刷新

以InProgress的dispatchedOrder方法为例,在状态更新成功回调中调用AllOrderFragment的刷新方法:

public void dispatchedOrder(String orderNo, int position){
    ApiService apiService = getRetrofitInstance().create(ApiService.class);
    UpdateOrderStatusData updateOrderStatusData = new UpdateOrderStatusData(orderNo,5);
    Call<UpdateOrderStatusData> call = apiService.updateOrderStatus(updateOrderStatusData);
    call.enqueue(new Callback<UpdateOrderStatusData>() {
        @Override
        public void onResponse(Call<UpdateOrderStatusData> call, Response<UpdateOrderStatusData> response) {
            if(response.isSuccessful()){
                progressDataList.remove(position);
                recyclerView.getAdapter().notifyItemRemoved(position);
                Toast.makeText(getContext(), "Order Dispatched successfully", Toast.LENGTH_SHORT).show();
                
                // 获取父Fragment并触发全局刷新
                if(getParentFragment() instanceof AllOrderFragment){
                    ((AllOrderFragment) getParentFragment()).triggerAllTabsRefresh();
                }
            }
            else{
                Toast.makeText(getContext(), "Error In dispatching Order", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<UpdateOrderStatusData> call, Throwable t) {
            Toast.makeText(getContext(), "Failed to Dispatched the  order", Toast.LENGTH_SHORT).show();
        }
    });
}

注意:其他子Fragment中修改订单状态的方法(如NewOrder的接受订单方法),也要添加同样的全局刷新触发代码。

内容的提问来源于stack exchange,提问作者Mamta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:30:07