Не удалось получить экземпляр ViewModel в классе RecyclerView.Adapter Kotlin - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в kotlin и пытаюсь создать приложение будильника.В этом приложении я использовал LiveData и RecycleView.Прямо сейчас мне нужно изменить статус тревоги:

switcher

Вот мой AlarmsRecyclerAdapter , где я пытался создать .onClickListener{}

override fun onBindViewHolder(holder: AlarmsRecyclerAdapter.AlarmItemHolder, position: Int) {
        //mAlarmViewModel = ViewModelProviders.of( context as Fragment)[AlarmViewModel::class.java]
        if (mAlarms != null) {
            val current = mAlarms!!.get(position)
            holder.view.edit_time_button.text = current.printTime()
            holder.view.switch_alarm_enabled.isEnabled = current.enabled

            holder.view.switch_alarm_enabled.setOnClickListener {
                current.enabled = !current.enabled
               // mAlarmViewModel.insert(current)
            }
        } else {
            // Covers the case of data not being ready yet.
            holder.view.edit_time_button.text = "no timer"
        }
    }

Также я попытался получить экземпляр ViewModel в строке комментария, но он просто выдает ошибки вроде

java.lang.ClassCastException: android.app.Application не может быть приведен к androidx.fragment.app.FragmentActivity в com.xxx.alarm.AlarmsRecyclerAdapter.onBindViewHolder (AlarmsRecyclerAdapter.kt: 58) в com.xxx.alarm.AlarmsRecyclerAdapter.onBindViewHolder (AlarmsRecyclerAdapter.kt: 33)

1018 * необходимость в 1018
*База данных.Так как же получить экземпляр ViewMoedel в классе адаптера?Или есть лучший способ управлять изменением данных?

1 Ответ

1 голос
/ 28 марта 2019

Не совсем уверен, что ваш ViewModel будет внутри вашего RecyclerView, и не совсем уверен, будет ли это считаться наилучшей практикой.Но вот способ, которым я делаю это, и другие видели, как это делают.Сначала вы создаете свою ViewModel в своем фрагменте.Затем вы наблюдаете ваши AlarmData, и когда они меняются, вы обновляете данные в своем RecyclerAdapter.

Таким образом, в вашем фрагменте вы делаете что-то вроде этого ():

mAlarmViewModel = ViewModelProviders.of( context as Fragment)[AlarmViewModel::class.java]
mAlarmViewMode.getAlarms().observe(...
    mAdapter.setData(newData)

и внутри своего адаптера вы добавляетеследующее:

setData(data:List) {
    mAlarms= data;
    notifyDataSetChanged();
}    

это должно держать ваши данные обновленными.

Теперь для изменения ваших данных.Попробуйте установить OnclickListener внутри ViewHolder, так как это увеличит скорость вашего приложения.чтобы получить текущее значение, вы можете сделать это:

val current = mAlarms!!.get(getAdapterPosition())

Наконец вы должны добавить интерфейс к вашему адаптеру, что-то вроде этого:

interface ItemSelectedListener {
  fun onItemSelected(item:Any, v:View)
}

Установите этот интерфейс из вашего фрагмента и вызовитеэто из onClickListener.Тогда у вас есть все данные, которые вам нужны, внутри вашего фрагмента, и вы можете изменить их там

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