Как использовать данные из onActivityResult в архитектуре MVVM? - PullRequest
0 голосов
/ 07 января 2020

Как использовать данные из onActivityResult в архитектуре MVVM? Мне нужно добавить элемент в RecyclerView, который подписан на получение данных из ViewModel. Как я могу отправить данные из onActivityResult в класс ViewModel и затем обновить мой список? Если я немедленно добавлю данные в адаптер из метода onactivityresult, ничего не произойдет. Мне нужна помощь по этому вопросу

Класс деятельности:

class ContactsActivity : AppCompatActivity(), ContactsListener {
    private val TAG = "ContactsActivity"

    @Inject
    lateinit var factory: ViewModelProvider.Factory
    lateinit var contactsViewModel: ContactsViewModel


    companion object {
        const val ADD_CONTACT_REQUEST = 200
    }

    private lateinit var mAdapter: ContactsAdapter

    @SuppressLint("WrongConstant")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        toolbar_contacts.title = getString(R.string.contacts_toolbar_title)

        add_new_contact_btn.setOnClickListener {
            val intent = Intent(this@ContactsActivity, AddContactActivity::class.java)
            startActivityForResult(intent, ADD_CONTACT_REQUEST)
        }

        DaggerContactsActivity_ContactsComponent.create().inject(this@ContactsActivity)
        contactsViewModel = ViewModelProviders.of(this@ContactsActivity, factory).get(ContactsViewModel::class.java)
        contactsViewModel.getContactsList().observe(this@ContactsActivity, Observer {

            mAdapter = ContactsAdapter(this@ContactsActivity, it)
            recycler_contacts.layoutManager =
                LinearLayoutManager(applicationContext, OrientationHelper.VERTICAL, false)
            recycler_contacts.adapter = mAdapter
            recycler_contacts.setHasFixedSize(true)

            mAdapter.sortByName()

        })
    }

    // Dagger create
    @Component (modules = [ContactsModule::class])
    interface ContactsComponent {

        fun inject (activity: ContactsActivity)
    }

    @Module
    abstract class ContactsModule {

        @Binds
    abstract fun bindViewModelFactory(factory: ContactsViewModelFactory): ViewModelProvider.Factory
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
            if (resultCode == ADD_CONTACT_REQUEST && resultCode == RESULT_OK) {
                val firstName: String? = data?.getStringExtra(AddContactActivity.EXTRA_FIRST_NAME)
                val lastName: String? = data?.getStringExtra(AddContactActivity.EXTRA_LAST_NAME)
                val phone: String? = data?.getStringExtra(AddContactActivity.EXTRA_PHONE)
                val email: String? = data?.getStringExtra(AddContactActivity.EXTRA_EMAIL)
                val notes: String? = data?.getStringExtra(AddContactActivity.EXTRA_NOTES)

                val contacts = Contacts(firstName = firstName.toString(), lastName = lastName.toString(), phone = phone.toString(),
                    email = email.toString(), notes = notes.toString(), images = "")

                contactsViewModel.get(contacts = contacts)
            }
        }

    override fun setupContactsList(contactsList: ArrayList<Contacts>) {

        mAdapter.setupContacts(contactsList = contactsList)
    }
}

Ответы [ 2 ]

2 голосов
/ 08 января 2020

В архитектуре MVVM вам не нужно обмениваться данными с помощью Activity onActivityResult. Вместо этого пусть целевой пользовательский интерфейс Activity связывается с LiveData ViewModel, который дополнительно указывает на тот же источник данных (например, sqLite), который обновляется другим действием (через его собственную ViewModel).

0 голосов
/ 08 января 2020

MVVM обеспечивает двустороннюю привязку. Просто обновите список, когда вы заканчиваете или очищаете действие, результат onActivity которого вы переопределили.

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

Посмотрите на работу MVVM с общим экземпляром: https://www.google.com/url?sa=t&source=web&rct=j&url=https: //github.com/android/architecture-components-samples/issues / 29 & ved = 2ahUKEwjn0ZWEzvPmAhUxzDgGHXhuBUsQFjAAegQICRAE & usg = AOvVaw36xQIOfJIp4abIODjXrz6S

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...