在recyclerview项上单击时,如何更新viewModel的实时数据

时间:2019-06-19 13:13:10

标签: android kotlin android-recyclerview android-livedata android-mvvm

我是Kotlin的新手,我正在尝试使用MVVM创建应用程序。 所以我想做的是使用存储库中的改造功能进行Web调用,并将数据返回到视图模型,然后观察片段中的数据,一旦数据更改,我就将其通知给回收者视图适配器工作正常。 现在,问题是我想从recyclerview更新ViewHolder的实时数据。当我单击recyclerView中的CheckBox时,应该更新数据。但是我不知道这样做的实际方法是什么。

这是我的ViewHolder。

class MainActivityViewModel : ViewModel() {

private var mutableLiveGitUsers: MutableLiveData<ArrayList<GitUsers>>? = null
private lateinit var gitUsersRepository: GitUsersRepository
var allUsersListener: AllUsersListener? = null

fun init() {

    gitUsersRepository = GitUsersRepository()
    allUsersListener?.onStarted()
    mutableLiveGitUsers = gitUsersRepository.getGitUsers()
    allUsersListener?.onSuccess(mutableLiveGitUsers!!)
}

fun getGitUsersData(): MutableLiveData<ArrayList<GitUsers>>? {
    return mutableLiveGitUsers
}

}

这是我观察片段变化的方式

mutableLiveGitUsers.observe(this, Observer {
        progressBar.hide()
        rvAllUsersAdapter = AllUsersAdapter(mainActivityViewModel.getGitUsersData()?.value!!)
        rvAllUsers.adapter = rvAllUsersAdapter
        rvAllUsersAdapter.notifyDataSetChanged()
    })

RecylerView适配器

class AllUsersAdapter(private var gitUsersArrayList: ArrayList<GitUsers>) :
RecyclerView.Adapter<AllUsersAdapter.AllUsersViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AllUsersViewHolder {
    val inflater: LayoutInflater = LayoutInflater.from(parent.context)
    val v: View = inflater.inflate(R.layout.items_all_users, parent, false)
    return AllUsersViewHolder(v)
}

override fun getItemCount(): Int {
    return gitUsersArrayList.size
}

override fun onBindViewHolder(holder: AllUsersViewHolder, position: Int) {

    holder.tvUserName.text = gitUsersArrayList[position].login

    Glide.with(holder.itemView.context)
        .load(gitUsersArrayList[position].avatarUrl)
        .centerCrop()
        .into(holder.imageView)

    holder.checkBox.isSelected = gitUsersArrayList.get(position).isSelected

    holder.checkBox.setOnCheckedChangeListener{compoundButton, isChecked ->

        if (isChecked){
    /* Here I want to change the live data so I can observe that changes in my 
fragment and can have an effect in UI*/

            Log.d("TESTC","AllUsersAdapter IsChecked")
        }else{
            Log.d("TESTC","AllUsersAdapter UnChecked")
        }
    }

}

class AllUsersViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    var tvUserName: TextView = itemView.findViewById(R.id.tvUserName)
    var imageView: ImageView = itemView.findViewById(R.id.imageView)
    var checkBox: CheckBox = itemView.findViewById(R.id.checkBox)
}
}

1 个答案:

答案 0 :(得分:0)

  1. 向适配器引入项目单击回调:
class AllUsersAdapter(private var gitUsersArrayList: ArrayList<GitUsers>,
 private val itemClickCallback: ((Boolean) -> Unit)?) :
RecyclerView.Adapter<AllUsersAdapter.AllUsersViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AllUsersViewHolder {
    val inflater: LayoutInflater = LayoutInflater.from(parent.context)
    val v: View = inflater.inflate(R.layout.items_all_users, parent, false)
    return AllUsersViewHolder(v)
}

override fun getItemCount(): Int {
    return gitUsersArrayList.size
}

override fun onBindViewHolder(holder: AllUsersViewHolder, position: Int) {

    holder.tvUserName.text = gitUsersArrayList[position].login

    Glide.with(holder.itemView.context)
        .load(gitUsersArrayList[position].avatarUrl)
        .centerCrop()
        .into(holder.imageView)

    holder.checkBox.isSelected = gitUsersArrayList.get(position).isSelected

    holder.checkBox.setOnCheckedChangeListener{compoundButton, isChecked ->

        if (isChecked){
    /* Here I want to change the live data so I can observe that changes in my 
fragment and can have an effect in UI*/

            Log.d("TESTC","AllUsersAdapter IsChecked")
 itemClickCallback?.invoke(true)
        }else{
            Log.d("TESTC","AllUsersAdapter UnChecked")
 itemClickCallback?.invoke(false)
        }
    }

}

class AllUsersViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    var tvUserName: TextView = itemView.findViewById(R.id.tvUserName)
    var imageView: ImageView = itemView.findViewById(R.id.imageView)
    var checkBox: CheckBox = itemView.findViewById(R.id.checkBox)
}
}
  1. 处理片段onViewCreated()中的click事件,在其中初始化适配器
 val rvAdapter = AllUsersAdapter(
            gitUsersArrayList = gitUsersArrayList, itemClickCallback = fun(status: Boolean) {
                navController().navigate(
                    viewModel.updateValue(status)
                )
            }
        )

  1. 创建所需的ViewModel函数:
class MainActivityViewModel : ViewModel() {

private var mutableLiveGitUsers: MutableLiveData<ArrayList<GitUsers>>? = null
private lateinit var gitUsersRepository: GitUsersRepository
var allUsersListener: AllUsersListener? = null

fun init() {

    gitUsersRepository = GitUsersRepository()
    allUsersListener?.onStarted()
    mutableLiveGitUsers = gitUsersRepository.getGitUsers()
    allUsersListener?.onSuccess(mutableLiveGitUsers!!)
}

fun getGitUsersData(): MutableLiveData<ArrayList<GitUsers>>? {
    return mutableLiveGitUsers
}

fun updateValue(status: Boolean) {
//@Todo Set new value based on status received
     // mutableLiveGitUsers.value = 
}
}