使用 ArrayList 中的数据填充 Android ListView 会将每个项目设置为与第一个项目相同

Populating an Android ListView with data from an ArrayList is setting each item to be the same as the first

我正在与 android 工作室合作,并尝试用数据填充 ListView,这些数据存储在设备内部存储器的文件中。我可以创建一个包含确切项目数的列表,因为有文件,但它们都应该显示不同的信息。目前,它们都显示与 ArrayList 中的第一项相同的数据。

代码如下:

 ContextWrapper contextWrapper = new ContextWrapper(getApplicationContext());
        File directory = contextWrapper.getDir(filepath, Context.MODE_PRIVATE);

        int counter = 0;

        int fileNameNumber = 1;

        filename = "newAssessment(" + fileNameNumber + ").json";

        internalFile = new File(directory, filename);

        JSONObject jsonObject;

        while (internalFile.exists()) {

            files.add(counter, internalFile);

            try {
                FileInputStream fis = new FileInputStream(internalFile);
                DataInputStream in = new DataInputStream(fis);
                BufferedReader br = new BufferedReader(new InputStreamReader(in));

                String strLine;

                while ((strLine = br.readLine()) != null) {
                    myData = myData + strLine;
                }
            }catch(IOException e){
                e.printStackTrace();
            }

                try {
                    jsonObject = new JSONObject(myData);

                    String assessmentDate = jsonObject.getString("assessmentDate");
                    String orchard = jsonObject.getString("orchard");

                    data.add(counter, assessmentDate + " : " + orchard);
                }catch(JSONException e){
                    e.printStackTrace();
                }

                counter++;
                fileNameNumber++;


            filename = "newAssessment(" + fileNameNumber + ").json";

            internalFile = new File(directory, filename);
        }

        LVAssessments.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data));

我可以确认正在存储不同的数据。更改先出现的项目是数组更改所有项目。

感谢您的帮助。

您需要使用for循环从json对象中获取所有数据并将它们添加到myData

您没有在外部 while 循环中初始化 myData。因此,在外部 while 循环中初始化您的 myData。

while (internalFile.exists()) {

            files.add(counter, internalFile);

            try {
                FileInputStream fis = new FileInputStream(internalFile);
                DataInputStream in = new DataInputStream(fis);
                BufferedReader br = new BufferedReader(new InputStreamReader(in));

                String strLine;

                while ((strLine = br.readLine()) != null) {
                    myData = myData + strLine;
                }
            }catch(IOException e){
                e.printStackTrace();
            }

                try {
                    jsonObject = new JSONObject(myData);

                    String assessmentDate = jsonObject.getString("assessmentDate");
                    String orchard = jsonObject.getString("orchard");

                    data.add(counter, assessmentDate + " : " + orchard);
                }catch(JSONException e){
                    e.printStackTrace();
                }

                counter++;
                fileNameNumber++;
                myData = "";


            filename = "newAssessment(" + fileNameNumber + ").json";

            internalFile = new File(directory, filename);
        }

        LVAssessments.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data));

问题在这里:

while ((strLine = br.readLine()) != null) {
                myData = myData + strLine;
            }

当 while 循环再次重复时,myData 仍然有旧数据。在上述 while 循环再次重复之前,您需要将 myData 初始化为一个新字符串。

myData = "";
while ((strLine = br.readLine()) != null) {
                myData = myData + strLine;
            }