只有ArrayList中显示第一个项目

时间:2015-04-02 10:58:25

标签: java android

我制作了EditTextButton。点击该按钮可将文本从EditText保存到ArrayList。然后ArrayList将持久保存到文件中。进一步点击会将文本从EditText附加到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

2 个答案:

答案 0 :(得分:0)

您继续使用ArrayListObjectInputStream个对象添加到文件中。但你只读了一个。我想您希望保留一个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时,

附加一个只有一个条目的ArrayList对象

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

如果你想保留你的原始代码,并且状态仅针对单个Activity而持有,并且Activity更改/应用程序重新启动等之间没有持久性。那么这应该可行。

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_APPEND更改为Context.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内容。

答案 1 :(得分:0)

您将()字符串存储到文件中,用逗号结束字符串,然后在阅读__(读取)后将结果拆分为",&#34 ;返回一个String数组。确保将字符串附加到文件中。 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, ",");