Как сохранить несколько строк, которые были добавлены в RecyclerView из другого действия, используя общие настройки? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть список книг, в которые пользователь может добавлять книги из деятельности 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;
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...