删除草稿自动返回后,如何实现ListView的刷新?
解决删除草稿返回后ListView不刷新的问题
问题核心是删除操作完成后,列表页面的数据源未同步更新,导致已删除的草稿仍显示。以下是几种可行的解决方案:
方案1:通过接口回调通知列表页面刷新
这是低耦合的最优方案,仅在删除成功时触发一次刷新:
- 定义回调接口
public interface OnDraftDeletedListener { void onDraftDeleted(); }
- 在列表页面(如
ItrListFragment)实现该接口
public class ItrListFragment extends Fragment implements OnDraftDeletedListener { private ListView listView; private DraftAdapter adapter; private List<Draft> draftList; // ... 其他初始化代码 @Override public void onDraftDeleted() { // 重新加载最新数据并刷新列表 loadDraftData(); adapter.notifyDataSetChanged(); } // 跳转详情页时绑定回调 private void openDraftDetail(String itrRaisedID) { ItrDetailFragment detailFragment = new ItrDetailFragment(); detailFragment.setDraftDeletedListener(this); getParentFragmentManager().beginTransaction() .replace(R.id.fragment_container, detailFragment) .addToBackStack(null) .commit(); } // 加载列表数据的方法 private void loadDraftData() { ApiHelper.get().getItrDrafts(new GetItrDraftsRequest(userID, projectID)) .enqueue(new ApiRequest.Callback<GetItrDraftsResponse>() { @Override public void onSuccess(GetItrDraftsResponse response) { draftList.clear(); draftList.addAll(response.getDrafts()); } @Override public void onFailure(String e) { ErrorManager.promptError(getActivity(), e); } }); } }
- 修改详情页的
deleteDraft方法,先回调再返回
public class ItrDetailFragment extends Fragment { private OnDraftDeletedListener mListener; public void setDraftDeletedListener(OnDraftDeletedListener listener) { mListener = listener; } public void deleteDraft() { ((LoaderActivity) getActivity()).getLoader().show(); ApiHelper.get().itrDeleteDraft(new ItrDeleteDraftApi.Request(userID, projectID, itrRaisedID)) .enqueue(new ApiRequest.Callback<ItrDeleteDraftApi.Response>() { @Override public void onSuccess(ItrDeleteDraftApi.Response response) { ((LoaderActivity) requireActivity()).getLoader().hide(); // 通知列表页面刷新 if (mListener != null) { mListener.onDraftDeleted(); } requireActivity().onBackPressed(); } @Override public void onFailure(String e) { ((LoaderActivity) getActivity()).getLoader().hide(); ErrorManager.promptError(getActivity(), e); } }); } // ... 其他代码 }
方案2:在列表页面onResume()中重新加载数据
如果不想引入回调逻辑,可以在列表页的onResume方法中自动刷新数据,适合数据量较小的场景:
public class ItrListFragment extends Fragment { @Override public void onResume() { super.onResume(); // 每次回到列表页都重新请求最新数据 loadDraftData(); } // loadDraftData方法同方案1 }
方案3:直接操作全局数据源(适合数据源全局管理的场景)
如果列表数据源是全局维护的(如单例管理的List),可以直接删除对应项后通知Adapter刷新:
// 在详情页deleteDraft的onSuccess方法中 @Override public void onSuccess(ItrDeleteDraftApi.Response response) { ((LoaderActivity) requireActivity()).getLoader().hide(); // 从全局数据源移除已删除的草稿 List<Draft> globalDraftList = DraftManager.getInstance().getDraftList(); Iterator<Draft> iterator = globalDraftList.iterator(); while (iterator.hasNext()) { Draft draft = iterator.next(); if (draft.getItrRaisedID().equals(itrRaisedID)) { iterator.remove(); break; } } // 通知列表Adapter刷新 if (ItrListFragment.getAdapter() != null) { ItrListFragment.getAdapter().notifyDataSetChanged(); } requireActivity().onBackPressed(); }
内容的提问来源于stack exchange,提问作者Unknown Developer
相关产品推荐
相关产品推荐

