0

Мне нужно сохранить список, который я создаю динамически с помощью кнопки «Добавить». Конечно, прямо сейчас, если я выхожу из приложения, элементы исчезают. Я tryied таким образом, но что-то не такСохранить элемент в listview с sharedpreferences

public class MainActivity extends Activity{ 
    private EditText etInput; 
    private Button btnAdd; 
    private ListView lvItem; 
    private ArrayList<String> itemArrey; 
    private ArrayAdapter<String> itemAdapter; 

    /* Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setUpView(); 

     // Eliminare un elemento al longClick con dialog di conferma 
     lvItem.setOnItemLongClickListener(new OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View v, 
        final int position, long id) { 
       // TODO Auto-generated method stub 
        AlertDialog.Builder adb = new AlertDialog.Builder(
        MainActivity.this); 
        adb.setTitle("Are you sure"); 
        adb.setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, 
            int which) { 
           // TODO Auto-generated method stub 
           itemArrey.remove(position); 
           itemAdapter.notifyDataSetChanged(); 

          } 
         }); 
       adb.setNegativeButton("No", 
         new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, 
            int which) { 
           // TODO Auto-generated method stub 
           dialog.dismiss(); 

          } 
         }); 
       adb.show(); 

       return false; 
      } 
     }); 

     lvItem.setClickable(true); 
     lvItem.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 

      Object o = lvItem.getItemAtPosition(position); 
      Intent intent2 = new Intent(getApplicationContext(), MainActivity.class); // Mettere settings.class quando creata 
      MainActivity.this.startActivity(intent2); 
      } 
     }); 
    } 

    private void setUpView() { 
     etInput = (EditText)this.findViewById(R.id.editText_input); 
     btnAdd = (Button)this.findViewById(R.id.button_add); 
     lvItem = (ListView)this.findViewById(R.id.listView_items); 


     itemArrey = new ArrayList<String>(); 
     itemArrey.clear(); 

     itemAdapter = new ArrayAdapter<String>(this, R.layout.customlistview,itemArrey); 
     lvItem.setAdapter(itemAdapter); 


     btnAdd.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 

       addItemList(); 
      } 
     }); 

    } 

    protected void addItemList() { 

    if (isInputValid(etInput)) { 
     itemArrey.add(0,etInput.getText().toString()); 
     etInput.setText(""); 

     itemAdapter.notifyDataSetChanged(); 

    } 

    } 

    protected boolean isInputValid(EditText etInput2) { 
     // TODO Auto-generatd method stub 
     if (etInput2.getText().toString().trim().length()<1) { 
      etInput2.setError("Insert value"); 
      return false; 
     } else { 
      return true; 
     } 

    } 
    // Shared preferences 
    protected void SavePreferences(String key, String value) { 
     // TODO Auto-generated method stub 
     SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = data.edit(); 
     editor.putString(key, value); 
     editor.commit(); 


    } 
    protected void LoadPreferences(){ 
     SharedPreferences data = PreferenceManager.getDefaultSharedPreferences(this); 
     String dataSet = data.getString("LISTS", "None Available"); 

     itemAdapter.add(dataSet); 
     itemAdapter.notifyDataSetChanged(); 
    } 

Я не знаю, как «вызов» общие предпочтения и я не знаю, если в этом смысле это правильно. Сейчас ничего не происходит, ничего не спасает. Кто-нибудь может мне помочь? Спасибо

+0

Где вы используете два метода SavePreferences и LoadPreferences? Я не вижу, чтобы они использовались где угодно. – trungdinhtrong

+0

Мне нужно позвонить в onCreate прямо? но вот проблема! Я не знаю, как их назвать. в onCreate я должен писать только 'SavePreferences()'? –

+0

'onCreate()' будет странным местом для сохранения данных, поскольку данные, вероятно, не существуют при первом запуске приложения. Однако он может быть хорошим местом для извлечения данных. –

ответ

1

Вы должны смотреть на этот API обучения о деятельности жизненного цикла:

http://developer.android.com/training/basics/activity-lifecycle/index.html

, а также это:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

Как вы можете видеть, ваша деятельность может исчезнуть, потому что пользователь активно уничтожает его (используя кнопку «Назад»), или система может его уничтожить. Если они уничтожают систему, вы можете использовать onSaveInstanceState для сохранения данных и onCreate для их получения. В этом случае вам не нужно использовать SharedPreferences - просто используйте Bundle, как описано в ссылке.

Однако, если вы хотите сохранить свои данные, когда пользователь закроет его, вы должны сохранить свои данные при вызове call on onDestroy(). И извлекайте данные, когда вызывается onCreate(). onDestroy() вызывается до того, как система подумает, что ваша деятельность больше не нужна, например, когда пользователь нажимает кнопку «назад». В этом случае вам нужно использовать один из методов хранения, предоставляемых android, включая Shared preferences. Как и кто-то другой, для этого требуется механизм «ключ, значение», поэтому он может не соответствовать 100% тому, что вы делаете. Использование sqlLite немного тяжело для этой задачи, поскольку ваши данные на самом деле не являются табличным типом (таблица с одним столбцом, фактически, которая по-прежнему не имеет базы данных, достойной IMO). Я считаю, что лучший способ сохранить ваш список - использовать внутренний файл. Когда вызывается onDestroy(), возьмите все свои данные и сохраните их в файл. Когда вызывается onCreate(), читайте файл и повторно заполняйте список. Вы можете прочитать о андроида файловой системы, в том числе внутренние файлы здесь:

http://developer.android.com/training/basics/data-storage/files.html

В тесной ноте, если нажмет клавишу «Home», ваша деятельность не будет уничтожена. Если он затем «принудительно закрывает» ваше приложение, то ничего не будет сохранено.Если вы все еще хотите сохранить его даже в этом случае, я предлагаю вам сохранить ваши данные, когда вызывается «onStop()» и сбрасывает свой список при вызове onStart().

+0

Я думаю, я попытаюсь использовать db. Это лучший способ для моего приложения. –

+0

Однако, спасибо за помощь –

+0

Добро пожаловать. Вы уже узнали, но если вы решили использовать db (с sqlLite), вы должны использовать CursorAdapter вместо ArrayAdapter. CursorAdapter эффективнее и безопаснее, когда ваш список огромен в любом случае. В этом случае вы добавляете в базу данных, как только пользователь ее предоставляет, и просто вызывайте notifyDataSetChanged(), чтобы обновить список. – trungdinhtrong

1

Прямо сейчас ничего не происходит, ничего не спасает.

Это потому, что вы никогда не называете свой метод SavePreferences().

Если вы хотите продолжить использование SharedPreferences, чтобы сохранить данные в своем списке, вам нужно будет позвонить SavePreferences() по каждому элементу в списке.

Однако SharedPreferences используются для хранения данных в формате ключа. Это означает, что для каждого элемента в вашем списке требуется ключ, и вам нужно знать этот ключ для извлечения данных. Если ваш список может содержать переменное количество элементов, SharedPreferences скорее всего не то, что вы хотите.

Я рекомендую прочитать документацию Storage Options, которая содержит полный пример с использованием Shared Preferences и обсуждает другие варианты, которые могут наилучшим образом удовлетворить ваши потребности.

+0

+ 1..and также, я думаю, это должно быть хорошо, если он сохранит все данные в onPause() и восстановит в onResume(). – Ranjit

+0

Вы имеете в виду использование sqlLite? –

+0

Мне нужно только сохранить элемент, который я создаю! я не знаю, как я мог бы сделать –