Могу ли я использовать ViewModelProvider и наблюдать в RecyclerView.Adapter? - PullRequest
0 голосов
/ 07 марта 2020

Я использую MVVM и RecyclerView в этом приложении, поэтому в режиме повторного просмотра список отображается идеально, но когда я добавляю модель представления в адаптер, я получаю сообщение об ошибке в logcat

Ваша активность еще не присоединена к экземпляру приложения. Вы не можете запросить ViewModel перед вызовом onCreate.

Я новичок в этом MVVM, и я знаю, возможно ли это или любой другой способ сделать это

Это мой класс адаптера с viewHolder

class KeefAdapter : RecyclerView.Adapter<KeefViewHolder>() 

{var dataOfAllKeef = listOf ()

init {

    dataOfAllKeef = arrayListOf("Marijuwana" , "Bango" , "Weed" , "Hash")


}



override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KeefViewHolder {

    lateinit var binding: KeefSingleItemBinding


    binding = DataBindingUtil.inflate(LayoutInflater.from(parent.context) , R.layout.keef_single_item , parent , false)


     val viewModel:OrderYourKeefViewModel = ViewModelProvider(OrderYourKeef()).get(OrderYourKeefViewModel::class.java)

    binding.orderViewModelWithSingle = viewModel


    viewModel.count.observe(OrderYourKeef(), Observer { newCountOfHash->

        binding.root.theCountOfHash.text = newCountOfHash.toString()
    })



    return KeefViewHolder(binding.root)
}



override fun getItemCount() = dataOfAllKeef.size




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



    val item = dataOfAllKeef[position]

    holder.keefName.text = item





    if (item.equals("Marijuwana"))
    {
        holder.keefImage.setImageResource(R.mipmap.marijuana)

    }else if (item.equals("Bango"))
    {
        holder.keefImage.setImageResource(R.mipmap.bango)

    }else if (item.equals("Weed"))
    {
        holder.keefImage.setImageResource(R.mipmap.weed)

    }else if (item.equals("Hash"))
    {
        holder.keefImage.setImageResource(R.mipmap.hashesh)

    }

}

}

класс KeefViewHolder (itemView: View): RecyclerView.ViewHolder (itemView) {

var keefName:TextView = itemView.keefName
var keefImage: ImageView = itemView.keefImage


var increase: Button = itemView.increaseTheCount
var decrease: Button = itemView.minusTheCount
var theCountOfKeef: TextView = itemView.theCountOfHash

}

1 Ответ

0 голосов
/ 07 марта 2020

Я думаю, что это неправильный способ реализации шаблона mvvm.

Вы должны вызвать viewModel = ViewModelProviders в вашем Activity. И после получения элементов списка передайте его в свой адаптер и вызовите notifyDataSetChanged ()

updateListItems(newListItems: List<YourItem>) {
 currentItems = newListItems
 notifyDataSetChanged()
}

Подробнее об этом здесь

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