按返回键回到HomeFragment时GridView加载的JSON数据重复增加如何解决
问题原因
- 你代码中的
menulist是全局变量,每次HomeFragment触发onCreateView生命周期(跳转后返回Fragment重建视图时都会触发),新请求返回的数据会直接追加到原有menulist的末尾,不会清空旧数据,自然会出现重复内容。 - 额外性能问题:你把GridView初始化、Adapter创建和绑定的逻辑写在了遍历JSON的循环里,每遍历一条数据就重新绑定一次Adapter,会造成不必要的资源浪费。
解决方案
按照以下步骤修改即可解决数据重复问题:
- 每次拿到接口返回数据、开始解析遍历之前,先调用
menulist.clear()清空原有数据 - 将GridView初始化、Adapter绑定的逻辑移到循环外部,仅执行一次
- (可选优化)如果不需要每次返回Fragment都刷新数据,可以在第一次请求成功后缓存数据,后续生命周期触发时直接读取缓存,避免重复发起网络请求
修改后的代码示例
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_home, container, false); getActivity().setTitle("Dashboard"); // 提前初始化GridView,无需在请求回调里重复查找控件 GridView gridView = view.findViewById(R.id.menu_item_grid); final HashMap<String, String> role = sharedPreference.getDetails(); String url = "http://myurl"; RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext()); StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject obj = new JSONObject(response); JSONArray array = obj.getJSONArray("data"); // 先清空旧数据,避免重复追加 menulist.clear(); for (int i = 0; i < array.length(); i++) { JSONObject data = array.getJSONObject(i); String menu_id = data.getString("menu_id"); String menu_name = data.getString("menu_name"); HashMap<String, String> row = new HashMap<>(); row.put("menu_id", menu_id); row.put("menu_name", menu_name); menulist.add(row); Log.e(TAG, "onResponse: " + menulist ); } // 遍历完所有数据后再设置Adapter,仅执行一次 ListAdapter listAdapter = new SimpleAdapter(getContext(), menulist, R.layout.home_menu, new String[]{"menu_name"}, new int[]{R.id.item_grid}); gridView.setAdapter(listAdapter); } catch (JSONException ex) { ex.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(getContext(), "error : " + error, Toast.LENGTH_SHORT).show(); } }); queue.add(stringRequest); return view; }
内容的提问来源于stack exchange,提问作者PieceofShid
相关产品推荐
相关产品推荐

