У меня есть две кнопки (Добавить контакт) и (Очистить все контакты), каждый раз, когда я заполняю информацию о контакте (имя, телефон, изображение), я сохраняю их с помощью SharedPreference, поэтому, если я закрою приложение и снова открою его, элементы должны появиться, но в моем коде ниже, всякий раз, когда я пытаюсь добавить или удалить контакт, ничего не происходит, я должен закрыть приложение и снова открыть его, чтобы обновить RecylerView.
Основная деятельность
contactAdapter = new ContactAdapter(getApplicationContext(), getExistedContactList(), new onRecyclerViewClickListener() {
@Override
public void onClick(View view, Contact contact) {
Toast.makeText(MainActivity.this, contact.getFullName(), Toast.LENGTH_SHORT).show();
}
});
recyclerView.setAdapter(contactAdapter);
Добавить контакт
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Contact contact = new Contact();
contact.setFullName(fullName.getText().toString());
contact.setPhoneNumber(phoneNumber.getText().toString());
contact.setContactProfilePictureURI(contactPictureUri.toString());
contacts.add(contact);
addToDB(fullName.getText().toString(), phoneNumber.getText().toString(), contactPictureUri.toString()); /*Add to database*/
recyclerView.setAdapter(contactAdapter);
contactAdapter.updateContactList(); /* Refresh/Update UI */
addContactDialog.dismiss(); /* dismiss Contact Dialog */
}
});
Удалить все контакты
private void removeAllContact() {
contacts.clear();
tinydb.clear();
contactAdapter.notifyDataSetChanged();/* Update UI */
}
Сохранение данных с помощьюSharedPreference
void addToDB(String fullName, String number, String uri) {
tinydb = new TinyDB(getApplicationContext());
ArrayList<Contact> postObjects = tinydb.getListObject("CONTACT_KEY", Contact.class);
ArrayList<Contact> arrayList = new ArrayList<>();
for (Object objs : postObjects) {
arrayList.add((Contact) objs);
}
Contact mContact = new Contact();
mContact.setFullName(fullName);
mContact.setPhoneNumber(number);
mContact.setContactProfilePictureURI(uri);
arrayList.add(mContact);
tinydb.putListObject("CONTACT_KEY", arrayList);
}
private List<Contact> getExistedContactList() {
tinydb = new TinyDB(getApplicationContext());
ArrayList<Contact> arrayList;
arrayList = tinydb.getListObject("CONTACT_KEY", Contact.class);
if (arrayList.size() == 0)
return contacts;
else
return arrayList;
}
Определите список контактов поверх класса:
ArrayList<Contact> contactList = new ArrayList<>();
Теперь отправьте его в адаптер и установите адаптер в Recyclerview в onCreate только один раз.
contactList.clear();
contactList.addAll(getExistedContactList());
contactAdapter = new ContactAdapter(getApplicationContext(), contactList, new onRecyclerViewClickListener() {
@Override
public void onClick(View view, Contact contact) {
Toast.makeText(MainActivity.this, contact.getFullName(), Toast.LENGTH_SHORT).show();
}
});
recyclerView.setAdapter(contactAdapter);
Теперь при нажатии кнопки «Добавить»:
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Contact contact = new Contact();
contact.setFullName(fullName.getText().toString());
contact.setPhoneNumber(phoneNumber.getText().toString());
contact.setContactProfilePictureURI(contactPictureUri.toString());
contactList.add(contact);
addToDB(fullName.getText().toString(), phoneNumber.getText().toString(), contactPictureUri.toString()); /*Add to database*/
contactAdapter.notifyDataSetChanged();
addContactDialog.dismiss(); /* dismiss Contact Dialog */
}
});
Аналогично напишите код для очистки списка контактов от БД и обновите UI.
Я не уверен, что ваш адаптер создается снова каждый раз, когда вы его вызываете. Вы должны добавить метод
update()в свой адаптер для обновления текущего списка вместо того, чтобы каждый раз создавать новый.