Обновление Recylerview: notifyDataSetChanged() не работает с ArrayList из SharedPreference

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

Я не уверен, что ваш адаптер создается снова каждый раз, когда вы его вызываете. Вы должны добавить метод update() в свой адаптер для обновления текущего списка вместо того, чтобы каждый раз создавать новый.

cesarmarch 13.06.2019 22:09
0
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определите список контактов поверх класса:

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.

Другие вопросы по теме