2015-05-02 3 views
1

Мне очень нужна помощь в решении этой проблемы. Вот часть кода. Я должен разбирать все файлы перед написанием вывода в текстовом файле. Проблема заключается в том, что она написала либо только разобранный 1-й xml, либо 2-й файл xml.Java Arraylist получает повторную инициализацию после каждой итерации цикла for

Метод написания:

new LoadCoordinatesTask().execute(); 
Button btncoor = (Button) findViewById(R.id.File); 
btncoor.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         if (isSDCardWritable()) { 
           StringBuilder locationStrBuilder = new StringBuilder(); 
           locationStrBuilder.append(coordinates + "\n"); 
           String locationStr = locationStrBuilder.toString(); 
         try { 
          File sdCard = Environment.getExternalStorageDirectory(); 
          File directory = new File(sdCard.getAbsolutePath()+"/FileReader"); 
          directory.mkdirs(); 
          File myFile = new File(directory, fileCoord); 

         myFile.createNewFile(); 
         FileOutputStream fOut = new FileOutputStream(myFile, true); 
         OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 
         myOutWriter.append(locationStr); 
         myOutWriter.close(); 
         fOut.close(); 
         Toast.makeText(getBaseContext(),"Successfully downloaded coordinates.",Toast.LENGTH_SHORT).show(); 
         } 
         catch (Exception e) { 
         Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show(); 
         } } 
         else 
         { 
          // SD Card Not Available 
          Toast.makeText(getBaseContext(),"SD Card Not Available",Toast.LENGTH_SHORT).show(); 
         } //else 

        }// onClick 
       }); 
       } 

метод FilenameFilter:

public FilenameFilter xmlFilter = new FilenameFilter() { 
     @override 
     public boolean accept (File dir,String name) { 
       return name.endsWith(".xml") || name.endsWith (".XML") 
} 
}; 
    private class LoadCoordinatesTask extends AsyncTask<String, Void, List<Coordinates>> { 
     for (String filename : dir.list(xmlFilter)) { 
       String path = dir.getAbsolutePath() + "/" + filename; 
       Log.i (TAG, path); 
       coordinates.addAll(parser.parse(path)); 
       Log.i (TAG, "message"); 
     } 
    return coordinates; 
    } 

журнал показывает это:

Test /storage/sdcard/Garmin/01.xml 
Test /storage/sdcard/Garmin/02.xml 
Test message 
Test message 

Но печать показывает только выход из /хранения/SDCard/Garmin /01.xmlдважды

+0

'files.length' возвращает ?? –

+1

Что такое 'f'? Вы не используете 'i' в своем цикле for, так что он просто выполняет один и тот же код дважды –

+1

Вероятно, вам нужны' файлы [i] 'вместо' f' – kaykay

ответ

1

В следующем коде вы переназначаете coordinates новый объект списка, чтобы указать, и именно поэтому он будет повторно инициализирован.

public List<Coordinates> coordinates = new ArrayList<Coordinates>(); 

    for (int i = 1; i <= files.length; i++) { 
    coordinates = parser.parse (f); 
    } 
    return coordinates; 

Вы должны попробовать:

public List<Coordinates> coordinates = new ArrayList<Coordinates>(); 

for (int i = 0; i <files.length; i++) { 
coordinates.addAll(parser.parse (f)); 
} 
return coordinates; 

Кроме того, что тип переменной f как я не могу найти его в коде. Я считаю, что он должен был иметь тип File, но не может догадаться, как вы не указали. Как только вы это сделаете, я отредактирую свой ответ.

+0

Я пробовал код ** should-try ** и дважды печатал последний прочитанный (проанализированный) файл. Так же, как и второй код, который я пробовал. Уже редактировал код для добавления метода FilenameFilter – LadyWinter

0

Я думаю, что вы хотите сделать это:

public FilenameFilter xmlFilter = new FilenameFilter() { 
     @override 
     public boolean accept (File dir,String name) { 
       return name.endsWith(".xml") || name.endsWith (".XML") 
} 
}; 

String files[] = dir.list(xmlFilter); 
File f; 
public List<Coordinates> coordinates = new ArrayList<Coordinates>(); 
for (String file_name:files) { 
    f=dir.getAbsolutePath() + "/" + filename; 
    coordinates.addAll(parser.parse (f)); 
} 
return coordinates; 

Нету?

+0

Спасибо, Sir, с этим кодом он дважды печатает второй файл xml. Y_Y – LadyWinter

Смежные вопросы