Android, ListView. Сохранить данные так, чтобы, закрывая приложение, добавленные элементы массива сохранялись
Есть String массив, который лежит в основе ListView, с помощью Button добавляется новый элемент массива. При выходе из приложения все добавленные элементы теряются. Как сделать так, чтобы они сохранялись и были доступны при новом входе в активити? На данном этапе пытаюсь использовать SharedPreferences, но все попытки мимо. Спасибо.
public class SubjectList extends AppCompatActivity {
ArrayList subject = new ArrayList<>();
ArrayAdapter<String> adapter;
String txt;
EditText nameSubject;
Button addSubject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subject_list);
subject.add("123");
subject.add("1234");
subject.add("12345");
ListView listView = findViewById(R.id.list);
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, subject);
listView.setAdapter(adapter);
nameSubject = findViewById(R.id.nameSubject);
final SharedPreferences sp = this.getSharedPreferences("Subject", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("Subject", nameSubject.getText().toString());
editor.apply();
addSubject = findViewById(R.id.btnAddSubj);
addSubject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
txt = nameSubject.getText().toString();
subject.add(sp.getString("Subject", "DEFAULT"));
nameSubject.setText("");
}
});
}
}
Ответы (3 шт):
Вы должны сохранять свои данные независимо от ListView или любой другой сущности, отвечающей за UI. Все что должен знать ListView это то какие данные показать и как их показать.
Сохранение должно происходить независимо от ListView. Где? Это уже вопрос вашей архитектуры. Например вы можете сохранять их куда-то в кеш сразу после получения данных из сети. Или вы можете сохранять готовый список данных для отображения в сущности которая отвечает за логику работы вашего экрана (Presenter, ViewModel и т.д.)
Добавление новых элементов тоже должно изначально быть обработано где-то в другом месте, опять же Presenter, ViewModel и т.п. А в список должен всякий раз передаваться новый список.
Как вариант можно сериализацией воспользоваться. Но не уверен, подойдёт ли это Вам в данном случае.
SharedPreferences подходит для сохранения небольших данных и восстановления их, например, при повороте экрана. ArrayList не стоит туда сохранять. Если данных будет много, то и ошибка вылезет. В вашем случае базу данных нужно подключать(sqlite, например).