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

按返回键回到HomeFragment时GridView加载的JSON数据重复增加如何解决

问题原因

  • 你代码中的menulist是全局变量,每次HomeFragment触发onCreateView生命周期(跳转后返回Fragment重建视图时都会触发),新请求返回的数据会直接追加到原有menulist的末尾,不会清空旧数据,自然会出现重复内容。
  • 额外性能问题:你把GridView初始化、Adapter创建和绑定的逻辑写在了遍历JSON的循环里,每遍历一条数据就重新绑定一次Adapter,会造成不必要的资源浪费。

解决方案

按照以下步骤修改即可解决数据重复问题:

  1. 每次拿到接口返回数据、开始解析遍历之前,先调用menulist.clear()清空原有数据
  2. 将GridView初始化、Adapter绑定的逻辑移到循环外部,仅执行一次
  3. (可选优化)如果不需要每次返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:36:05