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
相关产品推荐
相关产品推荐

