2013-08-06 2 views
1

Так что я делаю приложение, которое записывает звуки, а затем добавляет их в 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. Я также пытался использовать общие настройки, но я был очень неудачен. Я даже не приблизился к работе, поэтому я удалил код (иначе я бы поместил его там). Я был бы очень признателен, если бы кто-нибудь мог дать мне несколько указателей на то, как я могу сохранить добавленные строки в listview.

+0

вы не должны думать о сохранении, но данные для адаптера списка следует. Если вы сохраните данные и снова установите их в списке, вы сохранили бы свое состояние listview. –

ответ

1

Похоже, вы пытаетесь сохранить данные списка на устройстве (а не извлекать его с сервера). Вы должны проверить раздел Storage Options в руководстве.

Простейший (но не обязательно правильный) способ сделать это - сбросить сериализованный массив 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. программа установки ListView (setAdapters, setOnItemClickListener) в OnCreate вместо в setFileName().
  2. Попробуйте использовать setEmptyView() вместо emptyLibText
+0

Большое спасибо за рассказ о setEmptyListView(), я искал что-то вроде этого :) реализация IF-оператора просто для установки видимости будет слишком много работы, это было проще, я все еще не уверен, как я буду хранить данные списка, но код меня смущает, но я сделаю все возможное, чтобы он работал :) – Guy

Смежные вопросы