Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否保存listview状态(行)?_Java_Android_Eclipse_Android Listview - Fatal编程技术网

Java 是否保存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);

因此,我正在制作一个应用程序,记录声音,然后在另一个活动中将其添加到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();
                }
            });
创建时受保护的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.对您的代码的几点建议:

  • 在onCreate中而不是在setFileName()中设置ListView(setAdapters、setOnItemClickListener)
  • 尝试使用而不是emptyLibText

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

    最简单(但不一定是正确的)方法是将序列化的ArrayList转储到中。下面是它的一个片段(未测试):

    ArrayList文件名=。。。
    FileOutputStream fos=openFileOutput(文件名,Context.MODE\u PRIVATE);
    ObjectOutputStream oos=新的ObjectOutputStream(fos);
    oos.writeObject(文件名);
    oos.close();
    
    PS.对您的代码的几点建议:

  • 在onCreate中而不是在setFileName()中设置ListView(setAdapters、setOnItemClickListener)
  • 尝试使用而不是emptyLibText

  • 您不应该只考虑保存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();