java - 保存 ListView 状态(行)?

标签 java android eclipse android-listview

所以我正在制作一个记录声音的应用程序,然后将它们添加到另一个 Activity 的 ListView 中。录音后,要求用户重命名文件,然后直接添加到 ListView 中。

将项目添加到 ListView 代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recorded_library);

    listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, fileNames);
}

public void setFileName(final Editable filename) {
    Log.d("2", "Set filename from first activity " + filename);
    TextView emptyLibText = (TextView) findViewById (R.id.textView1);
    emptyLibText.setVisibility(TextView.INVISIBLE);

    //LISTVIEW
    fileNames.add(filename.toString()); 
    listView = (ListView) findViewById (R.id.mainListView);
    listView.setAdapter(listAdapter);

    //ALERT DIALOG
    final AlertDialog.Builder deleteAlert = new AlertDialog.Builder(this);

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
            player = new MediaPlayer();
            try {
                player.setDataSource(externalStoragePath + File.separator + "Android/data/com.whizzappseasyvoicenotepad/" + fileNames.get(arg2) + ".mp3");
                player.prepare();
                player.start();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Toast toast = Toast.makeText(getApplicationContext(), "Now playing: " + fileNames.get(arg2), Toast.LENGTH_SHORT);
            toast.show();
        }
    });

    listView.setOnItemLongClickListener(new OnItemLongClickListener(){

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            deleteAlert.setTitle("Warning");
            deleteAlert.setMessage("Are you sure you want to delete this?");
            toDelete = arg2;
            deleteAlert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    File directory = new File (externalStoragePath + File.separator + "Android/data/com.whizzappseasyvoicenotepad/");
                    File deleteFile = new File (directory, fileNames.get(toDelete) + ".mp3");
                    deleteFile.delete();
                    Log.i("TAG", "Deleting file: " + directory + fileNames.get(toDelete) + ".mp3");

                    listAdapter.remove(listAdapter.getItem(toDelete));
                    listAdapter.notifyDataSetChanged();

                    dialog.dismiss();
                }
            });

我做了很多研究,但我找不到任何地方如何保存 ListView 状态。我也尝试过使用 Shared Preferences 但我很不成功。我什至没有接近工作,所以我删除了代码(否则我会把它放在那里)。如果有人能给我一些关于如何将添加的行保存到 ListView 的指示,我将不胜感激。

最佳答案

看起来您正在尝试将列表数据保存在设备上(而不是从服务器获取)。您应该查看 Storage Options指南中的部分。

最简单(但不一定是正确的)方法是将序列化的 ArrayList 转储到 Internal Storage 中.这是它可能看起来的 fragment (未经测试):

ArrayList<String> filenames = ...
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(filenames);
oos.close();

附言。对您的代码的一些建议:

  1. 在 onCreate 而不是 setFileName() 中设置 ListView(setAdapters、setOnItemClickListener)。
  2. 尝试使用 setEmptyView()而不是 emptyLibText

关于java - 保存 ListView 状态(行)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18091682/

相关文章:

java - 启动 Elasticsearch 时无法加载 xerial snappy-java

java - 创建对象[同一实例的多个]

java - 如何正确转换 n 皇后数组输出

android - ListView 项目中的椭圆形 TextView 不起作用

java - 检查日期是否在两个日期之间 : time stamp (milliseconds)

c - 为什么 scanf 语句在第一个 printf 语句之前执行?

java - 使用Java的Selenium : Start Hub Server and register Nodes with Hub

java - Android Http ContentLength 始终为 -1

java - 新电脑,Eclipse 坏了

java - faces-config.xml.jsfdia 文件有什么用?