2015-04-02 85 views
0

我製作了一個EditText和一個Button。點擊該按鈕應將EditText中的文本保存到ArrayList中。 ArrayList然後被保存到一個文件。進一步點擊將文本從EditText附加到ArrayList然後文件。但是,保存文件後,我只能從文件中檢索第一項輸入。我想用逗號分隔的格式檢索整個列表。從ArrayList中只顯示第一個項目

按鈕單擊代碼:

String filename =「abc.text」; 
    List arrlist = new ArrayList(); 
    b2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String listtext = a1.getText().toString(); 
      // a1 is edittext 
      if (listtext.equals("")) { 
       Toast.makeText(getApplicationContext(), "Enter product", Toast.LENGTH_SHORT).show(); 
      } else { 
       arrlist.add(listtext); 
       a1.setText(""); 
       try { 
        FileOutputStream fos = openFileOutput(filename, Context.MODE_APPEND); 
        ObjectOutputStream oos = new ObjectOutputStream(fos); 
        oos.writeObject(arrlist); 
        oos.close(); 
        fos.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    }); 

從文件的ArrayList檢索:

List newarrList = new ArrayList(); 

FileInputStream fis = openFileInput(filename); 
ObjectInputStream restore = new ObjectInputStream(fis); 
newarrList= (ArrayList)restore.readObject(); 
restore.close(); 

String joined = TextUtils.join(", ", newarrList); 
Toast.makeText(getApplicationContext(),joined,Toast.LENGTH_LONG).show(); 
// only the first item is displayed, not sure why 
+0

您是否因爲任何原因而將文件保存在僅包含1個字符串的List中?你爲什麼不保存字符串? – 2015-04-02 11:04:09

+0

您不斷使用ObjectInputStream將ArrayList對象添加到文件中。但你只讀一個。我想你想保留一個ArrayList並更新文件而不是附加到它。 – Beggs 2015-04-02 11:06:47

+0

關閉**終止塊中的流** – EpicPandaForce 2015-04-02 12:51:39

回答

0

您不斷添加ArrayList對象使用ObjectInputStream文件。但你只讀一個。我認爲你想要保留一個單獨的ArrayList你添加數據,然後保存單個ArrayList到該文件,只要發生點擊而不是爲每個條目附加多個ArrayList

List arrist = new ArrayList(); 
arrlist.add(listtext); 
a1.setText(""); 
try { 
    FileOutputStream fos = openFileOutput(filename, Context.MODE_APPEND); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 

每一個onclick發生

oos.writeObject(arrlist); 
    oos.close(); 
    fos.close(); 
}... 

如果你要保持你的原代碼和狀態只保持一個單一的活動時間和活動之間沒有持續追加一個ArrayList對象只有一個入口更改/應用程序重新啓動等。那麼這應該工作。

final String filename = "abc.text"; 
File file = new File(filename); 
// moved out of onClickListener 
final List arrlist = new ArrayList(); 
try { 
     // load the previous contents if it exists 

     FileInputStream fis = openFileInput(filename); 
     ObjectInputStream restore = new ObjectInputStream(fis); 
     ArrayList newArrList = (ArrayList) restore.readObject(); 
     arrlist.addAll(newArrList); 
     restore.close(); 
     fis.close(); 
} catch (FileNotFoundException e) { 
    // ignore, maybe log 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} catch (OptionalDataException e) { 
    e.printStackTrace(); 
} catch (StreamCorruptedException e) { 
    e.printStackTrace(); 
} catch (IOException e) 
    e.printStackTrace() 
} 

b2.setOnClickListener(
     new View.OnClickListener() { 
      @Override 
      public void onClick(View v 
      ) { 

       String listtext = a1.getText().toString();  //a1 is edittext 

       if (listtext.equals("")) { 
        Toast.makeText(getApplicationContext(), "Enter product", Toast.LENGTH_SHORT).show(); 

       } else { 

        arrlist.add(listtext); 
        a1.setText(""); 
        try { 

變化Context.MODE_APPENDContext.MODE_PRIVATE否則我們保留充氣文件與垃圾

     FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 
         ObjectOutputStream oos = new ObjectOutputStream(fos); 
         oos.writeObject(arrlist); 
         oos.close(); 
         fos.close(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
         Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 

     } 
); 

另一種方法是不使用ObjectInputStream只是一條直線FileOutputStream中,並附加在每一次點擊String內容。

+0

問題是追加仍然發生在文件中。所以你第一次點擊你將會用一個條目寫一個'ArrayList'。第二次點擊你將寫入另外一個ArrayList和兩個條目。但是您的只讀讀取了第一個'ArrayList'並且只包含第一個條目。刪除'Context.MODE_APPEND'到 'FileOutputStream fos = openFileOutput(filename);' 應該修復它。 – Beggs 2015-04-02 11:32:01

+0

'FileOutputStream fos = openFileOutput(filename);'不起作用。'openFileOutput(filename,should have something)'http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,int) – Ted 2015-04-02 11:37:08

+0

使用'openFileOutput(filename,Context.MODE_PRIVATE )' – Beggs 2015-04-02 11:38:22

0

您存儲(寫入)字符串轉換成文件,結束字符串以逗號,和閱讀__後()將結果與分裂「」它返回一個字符串數組。確保你將字符串追加到文件中。作爲全局變量的變量爲ArrayList

//global variable 
    List arrlist = new ArrayList(); 
    ...... 
    //write to file 
    b2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String listtext = a1.getText().toString(); 
    ..... 
    arrlist.add(listtext); 
    ..... 
    listtext = listtext + ","; 
    FileOutputStream fOut = openFileOutput("file name here", Context.MODE_APPEND); 
    fOut.write(listtext .getBytes()); 
    fOut.close(); 
    .... 
    } 

    //reading from file 
    String fileContent = readFile(); 
    String[] items = TextUtils.split(fileContent, ","); 
+0

由於「Context.MODE_APPEND」,這會失敗。他只讀了第一個條目。看到我的回答如下 – Beggs 2015-04-02 11:34:21

+0

對不起,我搬出了問題。其實我是存儲字符串不是對象。 @Beggs謝謝。 – Bharatesh 2015-04-02 11:42:02

+0

我最初犯了同樣的錯誤。 – Beggs 2015-04-02 11:43:33