Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在MVVM体系结构中使用onActivityResult中的数据?_Android_Kotlin_Mvvm_Android Recyclerview_Android Mvvm - Fatal编程技术网

Android 如何在MVVM体系结构中使用onActivityResult中的数据?

Android 如何在MVVM体系结构中使用onActivityResult中的数据?,android,kotlin,mvvm,android-recyclerview,android-mvvm,Android,Kotlin,Mvvm,Android Recyclerview,Android Mvvm,如何在MVVM体系结构中使用onActivityResult中的数据?我需要向RecyclerView添加一个项目,该项目已订阅以从ViewModel接收数据。如何将数据从onActivityResult发送到ViewModel类,然后更新列表?如果我立即从onactivityresult方法向适配器添加数据,则不会发生任何事情。在这个问题上我需要任何帮助 活动类别: class ContactsActivity : AppCompatActivity(), ContactsListener {

如何在MVVM体系结构中使用onActivityResult中的数据?我需要向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)
    }
}
类ContactsActivity:AppCompatActivity(),ContactsListener{
private val TAG=“ContactsActivity”
@注入
lateinit变量工厂:ViewModelProvider.factory
lateinit var contactsViewModel:contactsViewModel
伴星{
const val ADD_CONTACT_REQUEST=200
}
私有lateinit var mAdapter:ContactsAdapter
@SuppressLint(“错误常量”)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
toolbar\u contacts.title=getString(R.string.contacts\u toolbar\u title)
添加\新\联系人\ btn.setOnClickListener{
val intent=intent(this@ContactsActivity,AddContactActivity::class.java)
startActivityForResult(意向、添加联系人请求)
}
DaggerContactsActivity_ContactsComponent.create().inject(this@ContactsActivity)
contactsViewModel=ViewModelProviders.of(this@ContactsActivityget(ContactsViewModel::class.java)
contactsViewModel.getContactsList()。观察(this@ContactsActivity,观察员{
mAdapter=触点dapter(this@ContactsActivity,it)
回收商\u联系人。布局管理器=
LinearLayoutManager(applicationContext,OrientationHelper.VERTICAL,false)
回收器_contacts.adapter=mAdapter
recycler_contacts.setHasFixedSize(真)
mAdapter.sortByName()
})
}
//匕首创造
@组件(模块=[ContactsModule::class])
接口触点组件{
乐趣注入(活动:ContactsActivity)
}
@模块
抽象类ContactsModule{
@束缚
抽象视图模型工厂(工厂:ContactsViewModelFactory):ViewModelProvider.factory
}
重写activityResult(请求代码:Int,结果代码:Int,数据:Intent?){
super.onActivityResult(请求代码、结果代码、数据)
if(resultCode==ADD\u CONTACT\u REQUEST&&resultCode==RESULT\u OK){
val firstName:String?=data?.getStringExtra(AddContactActivity.EXTRA\u FIRST\u NAME)
val lastName:String?=data?.getStringExtra(AddContactActivity.EXTRA\u LAST\u NAME)
val电话:字符串?=数据?.getStringExtra(AddContactActivity.EXTRA_电话)
val电子邮件:字符串?=数据?.getStringExtra(AddContactActivity.EXTRA_电子邮件)
val注释:字符串?=数据?.getStringExtra(AddContactActivity.EXTRA_注释)
val contacts=contacts(firstName=firstName.toString(),lastName=lastName.toString(),phone=phone.toString(),
email=email.toString(),notes=notes.toString(),images=“”)
contacts viewmodel.get(contacts=contacts)
}
}
覆盖趣味设置contactsList(contactsList:ArrayList){
mAdapter.setupContacts(contactsList=contactsList)
}
}

在MVVM体系结构中,您不需要使用活动的onActivityResult来交换数据。相反,让目标活动的UI绑定到ViewModel的LiveData,后者进一步指向由另一个活动(通过其自己的ViewModel)更新的相同数据源(例如sqLite)。

MVVM启用双向绑定。完成或清除已覆盖其onActivity结果的活动时,只需更新列表即可

该数据已在您以前的活动中订阅,并且在其他活动更新列表后,该数据将立即得到更新。ViewModel将在两个活动之间共享


看看MVVM与共享实例的工作情况:

我认为根本不需要
startActivityForResult
onActivityResult
。第二个活动可以修改实时数据,第一个活动可以观察它的变化。我如何实现这一点?这是不可能实现的。当第二个活动传递数据并销毁时,ViewModel将调用onCleared()方法,第一个活动将再次获得原始列表,因为没有其他数据源。我从Api中获取列表,并将其显示在RecyclerView中。之后,我需要临时将另一个项目添加到用户添加的列表中。此元素将一直显示,直到我第一次关闭应用程序。但我也会将此项目发送到服务器并将其添加到列表中。下次用户打开应用程序时,他们将从Api中获得一个添加了新元素的列表。好的,我想你可以这样做。当您的活动第一次需要数据时,其附加的Viewmodel会从API(在init上)获取数据并更新LiveData对象,而LiveData对象又会使用数据绑定更新RecyclerView。稍后,当用户手动输入数据时,将此数据传递给ViewModel以调用API。API成功后,更新LiveData对象,该对象将使用新条目自动更新RecyclerView。现在,如果您的流有不同的活动来添加新数据,我认为您应该将公共ViewModel附加到这两个活动。这样,无论导航流程如何,数据都将自动更新。