Сохранение нового элемента в RecyclerView
У меня есть код который позволяет добавлять новый элемент в RecyclerView. Проблема в том, что после перезапуска приложения элемент не сохраняется и просто пропадает. Как это решить?
package ru.mdev.moneybox;
import android.app.Dialog;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ImageView menu;
private EditText search;
private RecyclerView recview;
private Button create;
public ArrayList<Box> boxes;
private BoxAdapter adapter;
private Dialog dialog;
private TextView check;
private static final String BOXES_KEY = "boxes_key";
private static final String PREFS_NAME = "ru.mdev.moneybox";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
menu = findViewById(R.id.menu);
search = findViewById(R.id.search);
recview = findViewById(R.id.recview);
create = findViewById(R.id.create);
check = findViewById(R.id.check);
dialog = new Dialog(MainActivity.this);
recview.setLayoutManager(new LinearLayoutManager(this));
boxes = new ArrayList<>();
adapter = new BoxAdapter(boxes, MainActivity.this);
recview.setAdapter(adapter);
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.setContentView(R.layout.activity_create);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setCanceledOnTouchOutside(true);
dialog.show();
EditText name = dialog.findViewById(R.id.name);
EditText target = dialog.findViewById(R.id.target);
EditText starter = dialog.findViewById(R.id.starter);
Button ssave = dialog.findViewById(R.id.save);
ssave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (name.getText().toString().isEmpty() || target.getText().toString().isEmpty() || starter.getText().toString().isEmpty()) {
Toast.makeText(MainActivity.this, "Поля не могут быть пустыми", Toast.LENGTH_SHORT).show();
} else if (name.getText().length() > 20) {
Toast.makeText(MainActivity.this, "Название не может быть более 20 символов", Toast.LENGTH_SHORT).show();
} else {
boxes.add(new Box(name.getText().toString(), Integer.valueOf(target.getText().toString()), Integer.valueOf(starter.getText().toString())));
dialog.dismiss();
adapter.notifyDataSetChanged();
}
}
});
}
});
}
}
Ответы (1 шт):
Автор решения: mercidev
→ Ссылка
В итоге пришел к решению сам, использовал хранение данных в json.
Прилагаю код, вдруг кому пригодится:
public void saveData(ArrayList<Box> boxes) {
String jsonString = gson.toJson(boxes);
File file = new File(context.getFilesDir(), FILE_NAME);
try (FileWriter writer = new FileWriter(file)) {
writer.write(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
}
public ArrayList<Box> loadData() {
File file = new File(context.getFilesDir(), FILE_NAME);
if (!file.exists()) {
return new ArrayList<>();
}
try (FileReader reader = new FileReader(file)) {
Type listType = new TypeToken<ArrayList<Box>>() {}.getType();
return gson.fromJson(reader, listType);
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<>();
}
}