Как обновить LiveData и RecyclerView при возврате к предыдущему действию? - PullRequest
0 голосов
/ 21 марта 2020

Я изучаю Android и ViewModel и для улучшения знаний. Я занимаюсь разработкой проекта Android, и цель состоит в том, чтобы увеличить и реорганизовать его вместе с новыми знаниями. В данный момент я использую только ViewModel, LiveData и Activity (без фрагмента). Проект представляет собой книгу контактов, на первом экране есть обзор переработчика для отображения контактов, а внизу есть Fab для go на втором экране. На втором экране есть несколько полей для создания нового контакта. Для сохранения контактов используется атрибут stati c. На первом экране я создаю ViewModel с LiveData для обновления RecyclerView, а на втором экране я создаю ViewModel для получения данных и отправки в хранилище для статического сохранения контакта. Я хотел бы знать, как можно обновить liveata, когда я сохраняю контакт во втором экране, чтобы при его закрытии и go назад к первому экрану обновлялось представление переработчика. Я могу зарегистрировать контакт, но когда я возвращаюсь к предыдущему экрану, новое значение не отображается, я прошу прощения, если это глупый вопрос. Вот мой код:

AgendaListActivity (MainActivity)

class AgendaListActivity : AppCompatActivity() {
    private lateinit var viewModel: AgendaListViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_agenda_list)

        viewModel = ViewModelProviders.of(this).get(AgendaListViewModel::class.java)

        val observer = Observer<List<Contact>> {
            agenda_list.apply {
                layoutManager = LinearLayoutManager(this@AgendaListActivity, RecyclerView.VERTICAL, false)
                setHasFixedSize(true)
                adapter = AgendaListAdapter(it)
            }
        }

        viewModel.contactList.observe(this, observer)

        activity_agenda_list_fabAddContact.setOnClickListener {
            onClickAddContact()
        }

        viewModel.getContacts()
    }

    override fun onResume() {
        super.onResume()
    }

    fun onClickAddContact() {
        startActivity(Intent(this, ContactFormActivity::class.java))
    }
}

AgendaListViewModel

class AgendaListViewModel: ViewModel() {
    var contactList: MutableLiveData<List<Contact>> = MutableLiveData()
    var contactRepository:ContactRepository         = ContactRepository()

    fun getContacts() {
        contactList.value = contactRepository.getContactList()
    }
}

ContactFormActivity

class ContactFormActivity : AppCompatActivity() {

    private lateinit var name: String
    private lateinit var phone: String
    private lateinit var email: String
    private lateinit var viewModel: ContactFormViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_contact_form)

        viewModel = ViewModelProviders.of(this).get(ContactFormViewModel::class.java)

        activity_contact_form_btnAddContact.setOnClickListener {
            onClickAddContact()
        }
    }

    fun onClickAddContact() {
        getDataFromEditText()
        setDataToViewModel()
        viewModel.saveContact()
        finish()
    }

    fun getDataFromEditText() {
        name  = activity_contact_form_editName.text.toString()
        phone = activity_contact_form_editPhone.text.toString()
        email = activity_contact_form_editEmail.text.toString()
    }

    fun setDataToViewModel() {
        viewModel.setName(name)
        viewModel.setPhone(phone)
        viewModel.setEmail(email)
    }
}

ContactFormViewModel

class ContactFormViewModel: ViewModel() {

    private var name: String      = ""
    private var phone: String     = ""
    private var email: String     = ""
    private var contactRepository = ContactRepository()
    private var contact           = Contact()

    fun saveContact() {
        setContact()
        contactRepository.addContact(contact)
    }

    private fun setContact() {
        contact.setName(name)
        contact.setPhone(phone)
        contact.setEmail(email)
    }

    fun setName(name: String) {
        this.name = name
    }

    fun setPhone(phone: String) {
        this.phone = phone
    }

    fun setEmail(email: String) {
        this.email = email
    }
}

ContactRepository

class ContactRepository {

    companion object {
        var contactList: MutableList<Contact> = ArrayList<Contact>()
    }

    fun addContact(contact: Contact) {
        contactList.add(contact)
    }

    fun getContactList(): MutableList<Contact> {
        return ArrayList<Contact>(contactList)
    }

}

Контакт (модель)

class Contact {
    private var name: String = ""
    private var phone: String = ""
    private var email: String = ""

    fun setName(name: String) {
        this.name = name
    }

    fun setPhone(phone: String) {
        this.phone = phone
    }

    fun setEmail(email: String) {
        this.email = email
    }

    fun getName(): String {
        return name
    }
}

1 Ответ

0 голосов
/ 21 марта 2020

Если вы хотите сохранить контакт и обновить sh свой вид переработчика, вы можете сделать следующие параметры:

  1. SetActivityForResult -> Возвратить логическое значение, чтобы указать, что основное действие должно быть refre sh, чтобы вы могли извлекать данные из вашей модели представления
  2. Другой вариант - всегда загружать контакты в операции возобновления жизненного цикла, поэтому при сохранении контакта операция инициирует жизненный цикл onResume и извлекает данные
  3. И еще один вариант - поделиться своей моделью представления
  4. Создать одноэлементный репозиторий и использовать liveata для обновления ваших контактов. MainViewModel должен наблюдать за живыми данными репозитория, например, используя Transformations. Но я предпочитаю избегать синглтон-репозиториев с liveatas, также в этом случае он будет работать нормально.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...