Java 是否保存listview状态(行)?
因此,我正在制作一个应用程序,记录声音,然后在另一个活动中将其添加到listview中。录制完声音后,会要求用户重命名该文件,然后将其直接添加到listview中 将项目添加到listview代码:Java 是否保存listview状态(行)?,java,android,eclipse,android-listview,Java,Android,Eclipse,Android Listview,因此,我正在制作一个应用程序,记录声音,然后在另一个活动中将其添加到listview中。录制完声音后,会要求用户重命名该文件,然后将其直接添加到listview中 将项目添加到listview代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recorded_library);
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();
}
});
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u recorded\u library);
listAdapter=new ArrayAdapter(这个,R.layout.simplerow,文件名);
}
public void setFileName(最终可编辑文件名){
Log.d(“2”,“从第一个活动设置文件名”+文件名);
TextView emptyLibText=(TextView)findViewById(R.id.textView1);
emptyLibText.setVisibility(TextView.INVISIBLE);
//列表视图
add(filename.toString());
listView=(listView)findViewById(R.id.mainListView);
setAdapter(listAdapter);
//警报对话框
final AlertDialog.Builder deleteAlert=新建AlertDialog.Builder(此);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
player=新媒体播放器();
试一试{
player.setDataSource(externalStoragePath+File.separator+“Android/data/com.whizzappseasyvoicenotepad/”+fileNames.get(arg2)+“mp3”);
player.prepare();
player.start();
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
Toast Toast=Toast.makeText(getApplicationContext(),“正在播放:”+fileNames.get(arg2),Toast.LENGTH\u SHORT);
toast.show();
}
});
setOnItemLongClickListener(新的OnItemLongClickListener(){
@凌驾
长单击(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
deleteAlert.setTitle(“警告”);
deleteAlert.setMessage(“是否确实要删除此?”);
toDelete=arg2;
deleteAlert.setPositiveButton(“是”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
文件目录=新文件(externalStoragePath+File.separator+“Android/data/com.whizzappseasyvoicenotepad/”;
File deleteFile=新文件(目录,fileNames.get(toDelete)+“.mp3”);
deleteFile.delete();
Log.i(“标记”,“删除文件:”+目录+文件名.get(toDelete)+“.mp3”);
移除(listAdapter.getItem(toDelete));
listAdapter.notifyDataSetChanged();
dialog.dismise();
}
});
我做了很多研究,但我找不到任何地方如何保存listview状态。我也尝试使用共享首选项,但没有成功。我甚至没有接近工作状态,所以我删除了代码(否则我会将其放在那里)。如果有人能给我一些建议,告诉我如何将添加的行保存到listview,我将不胜感激。看起来您正在尝试将列表数据保存到设备上(而不是从服务器获取)。您应该查看指南中的部分 最简单(但不一定是正确的)方法是将序列化的ArrayList转储到中。下面是它的一个片段(未测试):
ArrayList文件名=。。。
FileOutputStream fos=openFileOutput(文件名,Context.MODE\u PRIVATE);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(文件名);
oos.close();
PS.对您的代码的几点建议:
看起来您正在尝试将列表数据持久化到设备上(而不是从服务器获取)。您应该查看指南中的部分 最简单(但不一定是正确的)方法是将序列化的ArrayList转储到中。下面是它的一个片段(未测试):
ArrayList文件名=。。。
FileOutputStream fos=openFileOutput(文件名,Context.MODE\u PRIVATE);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(文件名);
oos.close();
PS.对您的代码的几点建议:
您不应该只考虑保存listview适配器的数据。如果您保存数据并在listview上再次设置,您将保存listview状态,而不应该考虑保存listview适配器的数据。如果您保存数据并在listview上再次设置,您将保存listview状态,非常感谢您告诉我关于setEmptyListView(),我一直在寻找这样的东西:)实现IF语句只是为了设置可见性太麻烦了,这更简单,我仍然不确定如何存储listview数据,虽然您的代码让我困惑,但我会尽我所能使其工作:)非常感谢您告诉我setEmptyListView(),我一直在寻找类似的东西:)实现IF语句只是为了设置可见性太麻烦了,这更容易,我仍然不确定如何存储listview数据,但是,您的代码让我困惑,
ArrayList<String> filenames = ...
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(filenames);
oos.close();