Обновление Recylerview: notifyDataSetChanged () не работает с ArrayList из SharedPreference - PullRequest
0 голосов
/ 13 июня 2019

У меня есть две кнопки (Добавить контакт) и (Очистить все контакты) , каждый раз, когда я заполняю информацию о контакте (имя, телефон, изображение), я сохраняю их, используя SharedPreference, поэтому, если я закрою приложение и снова открою его, элементы должны появиться, но в моем коде ниже, всякий раз, когда я пытаюсь добавить или удалить контакт, ничего не происходит, я должен закрыть приложение и открыть его снова, чтобы обновить RecylerView.

MainActivity

        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;
    }

1 Ответ

1 голос
/ 13 июня 2019

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

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 */
            }
        });

Аналогично напишите код для очистки списка контактов из базы данных и обновления пользовательского интерфейса.

...