У меня есть список книг, в которые пользователь может добавлять книги из деятельности AddBook. Я пытаюсь сохранить данные книги, используя общие настройки. Каким-то образом мне удалось сохранить данные книги в общих настройках и перенести их в RecyclerView MainAcitvity самостоятельно.
Но вместо сохранения нескольких данных книги в RecyclerView сохраняются только последние данные книги, которые были добавлены из активности AddBook. Я хочу, чтобы все данные книги, которые пользователь передает, добавлялись в RecyclerView и сохранялись для будущего.
[Редактировать] Мне также нужно, чтобы удаленные элементы из RecyclerView были удалены навсегда. Как это сделать?
Вот MainActivity
public class MainActivity extends AppCompatActivity {
RecyclerView rcView;
static RecyclerView.Adapter adapter;
RecyclerView.LayoutManager layoutManager;
static ArrayList<Book> books;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rcView = findViewById(R.id.rcView);
rcView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(MainActivity.this);
rcView.setLayoutManager(layoutManager);
books = new ArrayList<Book>();
books.add(new Book("Twilight","Stephenie Meyer","Scifi"));
books.add(new Book("Pride and Prejuidice","Jane Austen","Drama"));
books.add(new Book("The Lord of The Rings","J.R.R. Tolkien","Drama"));
books.add(new Book("The Notebook","Nicholas Sparks","Romance"));
books.add(new Book("The Fault In Stars","John Green","Romance"));
SharedPreferences sharedPreferences = getSharedPreferences("BookData",MODE_PRIVATE);
String bookName = sharedPreferences.getString("bookName","");
String authorName = sharedPreferences.getString("authorName","");
String genreName = sharedPreferences.getString("genreName","");
int requestCode = sharedPreferences.getInt("requestCode",0);
if (requestCode != 0)
{
books.add(new Book(bookName,authorName,genreName));
}
adapter = new BookAdapter(MainActivity.this,books);
rcView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.iconAddBook:
Intent intent = new Intent(MainActivity.this, AddBook.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}}
Вот действие AddBook
public class AddBook extends AppCompatActivity {
EditText etBookName, etAuthorName;
Button btnAddBook;
Spinner spGenre;
AlertDialog.Builder dialog;
String genre;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
int REQUEST_CODE = 4543;
public static final String MY_PREFS_FILENAME = "com.example.listofbooks.Book";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_book);
etBookName = findViewById(R.id.etBookName);
etAuthorName = findViewById(R.id.etAuthorName);
btnAddBook = findViewById(R.id.btnAddBook);
spGenre = findViewById(R.id.spGenre);
//Setting up spinner
List<String> genreList = new ArrayList<>();
genreList.add(0,"Select genre");
genreList.add(1,"Scifi");
genreList.add(2,"Drama");
genreList.add(3,"Romance");
genreList.add(4,"Other");
ArrayAdapter<String> genreAdapter = new ArrayAdapter<>(AddBook.this,R.layout.support_simple_spinner_dropdown_item,genreList);
genreAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spGenre.setAdapter(genreAdapter);
spGenre.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (parent.getItemAtPosition(position).equals("Select genre")){
}
else {
genre = parent.getItemAtPosition(position).toString();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
dialog = new AlertDialog.Builder(AddBook.this);
dialog.setMessage("Looks like you didn't properly fill out all the fields").setTitle("Something is wrong");
dialog.setPositiveButton("Continue", null);
btnAddBook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (etBookName.getText().toString().isEmpty() || etAuthorName.getText().toString().isEmpty() || spGenre.getSelectedItem().equals("Select genre"))
{
dialog.show();
}
else
{
String bookName = etBookName.getText().toString().trim();
String authorName = etAuthorName.getText().toString().trim();
String genreName = genre;
sharedPreferences = getSharedPreferences("BookData",MODE_PRIVATE);
editor = sharedPreferences.edit();
editor.putString("bookName", bookName);
editor.putString("authorName",authorName);
editor.putString("genreName",genreName);
editor.putInt("requestCode", REQUEST_CODE);
editor.commit();
MainActivity.books.add(new Book(bookName,authorName,genreName));
MainActivity.adapter.notifyDataSetChanged();
Toast.makeText(AddBook.this,bookName + " added to the list",Toast.LENGTH_SHORT).show();
etBookName.setText(null);
etAuthorName.setText(null);
}
}
});
}}
Вот BookAdapter (на тот случай, если вам нужно)
public class BookAdapter extends RecyclerView.Adapter<BookAdapter.ViewHolder> {
private ArrayList<Book> books;
public BookAdapter(Context context, ArrayList<Book> list)
{
books = list;
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivGenre, ivDelete;
TextView tvBookName, tvAuthor;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivGenre = itemView.findViewById(R.id.ivGenre);
tvBookName = itemView.findViewById(R.id.tvBookName);
tvAuthor = itemView.findViewById(R.id.tvAuthor);
ivDelete = itemView.findViewById(R.id.ivDelete);
}
}
@NonNull
@Override
public BookAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_items,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull BookAdapter.ViewHolder holder, final int position) {
holder.tvBookName.setText(books.get(position).getBookName());
holder.tvAuthor.setText(books.get(position).getAuthorName());
if (books.get(position).getGenre().equals("Scifi")) {
holder.ivGenre.setImageResource(R.drawable.scifi);
}
if (books.get(position).getGenre().equals("Drama")) {
holder.ivGenre.setImageResource(R.drawable.drama);
}
if (books.get(position).getGenre().equals("Romance")) {
holder.ivGenre.setImageResource(R.drawable.romance);
}
if (books.get(position).getGenre().equals("Other")) {
holder.ivGenre.setImageResource(R.drawable.book);
}
holder.ivDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeBook(position);
}
});
}
@Override
public int getItemCount() {
return books.size();
}
public void removeBook(int position)
{
books.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, books.size());
}}
А вот книжная активность
public class Book {
private String bookName;
private String authorName;
private String genre;
public Book(String bookName, String authorName, String genre) {
this.bookName = bookName;
this.authorName = authorName;
this.genre = genre;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}}