我目前正在开发一款记录声音并将其保存为* .mp3文件的应用。一旦用户完成录制声音,他就会被要求重命名。用户完成重命名后,文件将保存到手机上的某个位置,如同任何TheUserTypedHere.mp3。
我目前在应用中实施的内容:
用户设置文件名后,文件名将被带到第二个活动(名为'filename'的变量)。这是制作列表视图的代码:
//global variables
ListView listView;
ArrayAdapter<String> listAdapter;
ArrayList<String> fileNames = new ArrayList<String>();
//this is inside onCreate
listView = (ListView) findViewById (R.id.mainListView);
listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow, fileNames);
//this is inside the method that is called everytime file is recorded
public void setFileName(final Editable filename) {
Log.d("2", "Set filename from first activity " + filename);
fileNames.add(filename.toString());
listView.setAdapter(listAdapter);
所以这一切都可行。每次记录和重命名文件时,它都会立即在第二个活动中添加到listView。但是这个代码有一个巨大的缺陷 - listview的状态没有保存,因此每次关闭应用程序并重新打开它时,录制的文件仍然存在于手机的存储中,但listView无处可寻。所以我需要做的是实现一些能够在每次更改时保持listview状态的东西。
我在想我能做什么:
我在想一个更简单的方法就是别的。不是在录制时向listView添加元素,而是保存listview的状态,我基本上可以在每次打开活动时构建一个新的listView。我可以实现一个方法来读取手机上的特定目录,只读取* .mp3文件。因此,每次打开listview活动时,listView都将根据特定目录中的文件自动“生成”。
我要求的是什么:
我是Android编程的新手,我只做了2-3个月。如果人们可以给我一些关于我应该做什么的指示,我会非常感激。我应该保留当前实现的方法,在记录文件后立即添加listView行吗?如果是这样,我将如何保存它的状态/如何保存它添加的行?或者更容易实现从某个目录读取文件然后在每次打开活动时生成列表视图的方法?如果是这样,我会非常感谢有关如何做到这一点的一些指示,因为我之前从未做过类似的事情。
谢谢!
答案 0 :(得分:1)
如果每次打开应用程序时都必须扫描整个存储上的所有.mp3文件,则需要很长时间。即使它仅限于特定文件夹,最好自己存储包含listview的文件。此文件必须存储在您自己的应用程序的边界内,并且必须始终存储在同一位置。如果它不存在,那么您知道用户第一次打开了您的应用程序。
如果你想快速了解java BufferedWriter,你可以在这里找到一个:http://www.mkyong.com/java/how-to-write-to-file-in-java-bufferedwriter-example/
答案 1 :(得分:0)
您需要以持久的形式保存数据。然后,您应该在第二个活动的onCreate
方法中检索(或开始检索)它。这可以通过多种方式处理。例如,您可以简单地从存储.mp3文件的文件夹中读取每个文件名,构造一个数组,并使用当前正在执行的ArrayAdapter
。唯一的区别是您每次活动开始时都会读取数据。 (这对于正确处理活动生命周期是必要的,例如,当用户只是重新定位手机时,活动可以被销毁并重新创建。)
不是直接读取文件系统,更好的方法可能是使用数据库或Android中可用的其他持久存储机制之一来维护文件名列表。 (请参阅指南主题Storage Options以及教程Saving Data。)我建议使用SQLite数据库。这是一项设置工作,但它提供了很大的灵活性,Android提供了很好的类来帮助将数据从数据库传输到屏幕。例如,如果您将活动设为ListActivity
,则只需在onCreate
中为数据发出查询,告诉活动管理生成的游标,在结果周围包裹SimpleCursorAdapter
,并告诉活动使用适配器。然后,系统将自动处理所有活动生命周期事件的正确处理。
有很多材料可以告诉你如何做到这一点。除了上述链接之外,还有几个示例项目(上述链接将引用您),以及网上的几个好的第三方教程(例如this one)。