有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java andriod中使用notifyDataSetChanged()后,安卓 Arraylist未重新填充

我正在尝试使用arraylist。清除并安装适配器。notifyDataSetChanged()要清除arraylist,列表已成功清除,但当我尝试再次使用某些数据重新加载列表时,尽管存在arraylist,列表仍不会显示。显示大于0的项目总数的大小。下面是创建初始列表的方法

private void getTH(int ID) {
        url = "url";
        mainAdapterClasses = new ArrayList<>();

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, response -> {
            try {
                JSONObject jsonObject0 = new JSONObject(response);
                String code = jsonObject0.getString("code");;
                if (code.matches("200")) {
                    JSONArray jsonArray = jsonObject1.getJSONArray("items");
                    if(jsonArray.length() == 0){
                        txtEmpty.setText(String.format("%s %s", getString(R.string.no), getString(R.string.empty)));
                    } else {
                        for (int k = 0; k < jsonArray.length(); k++) {
                            JSONObject jsonObject = jsonArray.optJSONObject(k);
                            String na = jsonObject.optString("na", "NA");
                            String aT = jsonObject.optString("Type", "NA")
                            
                            MainAdapterClass mainAdapterClass = new MainAdapterClass();
                            mainAdapterClass.setName(na);
                            mainAdapterClass.setType(aT);
                            mainAdapterClasses.add(mainAdapterClass);

                        }
                            mainAdapter = new TAdapter(WalletHome.this, mainAdapterClasses);
                            listView.setAdapter(mainAdapter);
                            mainAdapter.notifyDataSetChanged();
                            txtEmpty.setText("Data Is Here"+mainAdapterClasses.size());
                    }
                }
            } catch (JSONException e) {
                Toast.makeText(this, ""+getString(R.string.unknown_err), Toast.LENGTH_SHORT).show();
            }
        })
        requestQueue.add(stringRequest);
    }

下面是重新加载列表的代码

    @Override
    public void getRadioButtonListener1(int position) {
        WClass wClass = stateClassArrayList.get(position);
        wId = wClass.getWId();
        if(mainAdapter.getCount() > 0){
            mainAdapterClasses.clear();
            mainAdapter.notifyDataSetChanged();
            getTH(id);
        }
    }

我试图在这里记录问题每次运行该方法时,该方法都会获取当前的项目总数唯一的问题是列表在最初清除后没有填充新数据

txtEmpty.setText("Data Is Here"+mainAdapterClasses.size());

任何帮助都将不胜感激,谢谢


共 (2) 个答案

  1. # 1 楼答案

    乍一看,您似乎是在用“na”和“At”变量创建并填充“MainAdapterClass”,但并没有在任何地方使用它们,所以您并不是在向MainAdapterClass数组中添加项

    其次,在for循环中,每次都要重新创建和设置适配器。我建议在数组(MainAdapterClass)中填充请求项后,在foor循环之外创建和设置适配器

    for (int k = 0; k < jsonArray.length(); k++) {
        JSONObject jsonObject = jsonArray.optJSONObject(k);
        String na = jsonObject.optString("na", "NA");
        String aT = jsonObject.optString("Type", "NA")
        
        MainAdapterClass mainAdapterClass = new MainAdapterClass();
        mainAdapterClass.setName(na);
        mainAdapterClass.setType(aT);
    
        mainAdapterClasses.add(mainAdapterClass);
    } //for 
    mainAdapter = new TAdapter(WalletHome.this, mainAdapterClasses);
    listView.setAdapter(mainAdapter);
    mainAdapter.notifyDataSetChanged();
    txtEmpty.setText("Data Is Here"+mainAdapterClasses.size());
    
  2. # 2 楼答案

    您忘记将mainAdapterClass添加到ArrayList

    for (int k = 0; k < jsonArray.length(); k++) {
        JSONObject jsonObject = jsonArray.optJSONObject(k);
        String na = jsonObject.optString("na", "NA");
        String aT = jsonObject.optString("Type", "NA")
        
        MainAdapterClass mainAdapterClass = new MainAdapterClass();
        mainAdapterClass.setName(na);
        mainAdapterClass.setType(aT);
    
        mainAdapterClasses.add(mainAdapterClass); // Add this line.
    }
    

    不要在循环内设置适配器。只需添加项,然后将适配器设置在循环之外。 在设置适配器之后调用notifyDataSetChanged()也没有意义

    for (int i = 0; i < jsonArray.length(); i++) {
       // ...
    }
    
    listview.setAdapter(mainAdapter);