回到之前activity如何更新LiveData和RecyclerView?
How to update LiveData and RecyclerView when returning to the previous activity?
我正在学习 Android 和 ViewModel,为了提高知识,我正在开发一个 Android 项目,objective 是随着新知识的增加和重构。此时我只使用 ViewModel、LiveData 和 Activity(没有片段)。该项目是一个通讯录,在第一个屏幕上有一个 recyclerview 来显示联系人,在底部有一个 Fab 去第二个屏幕。在第二个屏幕中有一些用于创建新联系人的字段。保存联系人使用静态属性。在第一个屏幕上,我创建了一个 ViewModel,它有一个 LiveData 来更新 RecyclerView,在第二个屏幕上,我创建了一个 ViewModel 来获取数据并发送到存储库以静态保存联系人。我想知道当我在第二个屏幕中保存联系人时如何更新实时数据,以便当您关闭它并返回到第一个屏幕时,回收器视图会更新。我可以注册联系人,但是当我 return 到上一个屏幕时,没有显示新值 如果这是一个愚蠢的问题,我深表歉意。这是我的代码:
议程列表Activity(主要Activity)
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()
}
}
联系表Activity
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
}
}
联系人存储库
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
}
}
如果您想保存联系人并刷新您的回收站视图,您可以执行以下选项:
- SetActivityForResult -> Return 一个布尔值,表示主 activity 必须刷新,以便您可以从视图模型中获取数据
- 恢复生命周期中的另一个选项始终是 loadContacts activity,因此当您保存联系人时,activity 会初始化 onResume 生命周期并获取数据
- 另一种选择是分享您的视图模型
- 创建单例存储库并使用实时数据更新您的联系人。 MainViewModel 必须观察存储库实时数据,例如使用转换。但我更喜欢避免使用带有 livedatas 的单例存储库,在这种情况下它也能正常工作。
我正在学习 Android 和 ViewModel,为了提高知识,我正在开发一个 Android 项目,objective 是随着新知识的增加和重构。此时我只使用 ViewModel、LiveData 和 Activity(没有片段)。该项目是一个通讯录,在第一个屏幕上有一个 recyclerview 来显示联系人,在底部有一个 Fab 去第二个屏幕。在第二个屏幕中有一些用于创建新联系人的字段。保存联系人使用静态属性。在第一个屏幕上,我创建了一个 ViewModel,它有一个 LiveData 来更新 RecyclerView,在第二个屏幕上,我创建了一个 ViewModel 来获取数据并发送到存储库以静态保存联系人。我想知道当我在第二个屏幕中保存联系人时如何更新实时数据,以便当您关闭它并返回到第一个屏幕时,回收器视图会更新。我可以注册联系人,但是当我 return 到上一个屏幕时,没有显示新值 如果这是一个愚蠢的问题,我深表歉意。这是我的代码:
议程列表Activity(主要Activity)
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()
}
}
联系表Activity
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
}
}
联系人存储库
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
}
}
如果您想保存联系人并刷新您的回收站视图,您可以执行以下选项:
- SetActivityForResult -> Return 一个布尔值,表示主 activity 必须刷新,以便您可以从视图模型中获取数据
- 恢复生命周期中的另一个选项始终是 loadContacts activity,因此当您保存联系人时,activity 会初始化 onResume 生命周期并获取数据
- 另一种选择是分享您的视图模型
- 创建单例存储库并使用实时数据更新您的联系人。 MainViewModel 必须观察存储库实时数据,例如使用转换。但我更喜欢避免使用带有 livedatas 的单例存储库,在这种情况下它也能正常工作。