Как обновить оперативные данные viewModel, когда выполняется щелчок по элементу программы повторного просмотра - PullRequest
1 голос
/ 19 июня 2019

Я новичок в Kotlin, и я пытаюсь создать приложение с MVVM.так что я пытаюсь сделать, это сделать веб-вызов с использованием дооснащения в хранилище и вернуть данные в модель представления, а затем наблюдать данные из фрагмента, и как только данные меняются, я сообщаю об этом адаптеру представления переработчика.работает нормально.Теперь проблема заключается в том, что я хочу обновить эти данные в реальном времени из ViewHolder из окна восстановления.когда я нажимаю на CheckBox в recyclerView, данные должны обновляться.Но я не знаю, как на самом деле это сделать.

Вот мой 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 голосов
/ 20 июня 2019
  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)
}
}
Обработайте событие click в вашем фрагменте onViewCreated (), где вы инициализируете адаптер
 val rvAdapter = AllUsersAdapter(
            gitUsersArrayList = gitUsersArrayList, itemClickCallback = fun(status: Boolean) {
                navController().navigate(
                    viewModel.updateValue(status)
                )
            }
        )

Создайте требуемую функцию 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 = 
}
}
...