2016-04-26 9 views
0

Ich arbeite mit dem Android Studio und versuche, eine ListView mit Daten zu füllen, die in Dateien auf dem internen Speicher der Geräte gespeichert ist . Ich bin in der Lage, eine Liste mit der genauen Anzahl der Elemente zu erstellen, da es Dateien gibt, die aber alle unterschiedliche Informationen anzeigen sollen. Im Moment zeigen sie alle dieselben Daten wie das erste Element in der ArrayList an. HierDas Füllen eines Android ListView mit Daten aus einer ArrayList setzt jedes Element auf das gleiche wie das erste

ist der Code:

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)); 

Ich kann bestätigen, dass verschiedene Daten gespeichert werden. Ändern des Elements, das zuerst kommt, ändert das Array alle Elemente.

Danke für die Hilfe.

+1

wo wurden Sie initialisiert ** Daten **? – KishuDroid

+0

Es ist eine Klassenvariable private Liste data = new ArrayList <>(); ' – mgrantnz

+0

Deklarieren Sie es in Ihrer Methode – KishuDroid

Antwort

1

Sie nicht myData in externen while-Schleife initialisieren. Initialisiere deine myData in der externen while-Schleife.

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)); 
+0

Das hat den Trick, vielen Dank. – mgrantnz

0

Sie müssen sich für Schleife verwenden, um alle Daten aus dem JSON-Objekt zu erhalten, und fügen Sie sie in myData

+0

zu initialisieren Können Sie mir geben ein Beispiel? Ich finde es schwer zu verstehen, was du meinst, danke. – mgrantnz

1

Das Problem ist hier:

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

myData hat immer noch die älteren Daten, wenn die while-Schleife wieder wiederholt. Sie müssen myData auf eine neue Zeichenfolge initialisieren, bevor die obige while-Schleife erneut wiederholt wird.

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