簡體   English   中英

保存列表視圖狀態(行)?

[英]Save listview state (rows)?

因此,我正在制作一個記錄聲音的應用程序,然后將其添加到另一個活動的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的指示,我將不勝感激。

看起來您正在嘗試將列表數據保留在設備上(而不是從服務器中獲取)。 您應該查看指南中的“ 存儲選項”部分。

最簡單(但不一定正確)的方法是將序列化的ArrayList轉儲到Internal Storage中 以下是其外觀的摘要(未經測試):

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

PS。 針對您的代碼的一些建議:

  1. 在onCreate而不是setFileName()中設置ListView(setAdapters,setOnItemClickListener)。
  2. 嘗試使用setEmptyView()代替emptyLibText

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM