1

При использовании SwitchCompat в RecyclerView, если добавить в список 3 записи и изменить состояние SwitchCompat и заполнить добавить еще записей что бы появилась прокрутка тогда некоторые SwitchCompat переходят в исходное состояние.
Что с этим делать не знаю, еще новичок в Android.

GitHub

Adapter:

class AlarmListAdapter(list: MutableList<AlarmItemListData>): RecyclerView.Adapter<AlarmListAdapter.AlarmViewHolder>(){

val list:MutableList<AlarmItemListData> = list
val checkedL = AlarmCheckedListener(list)






class AlarmViewHolder(val view: View?) : RecyclerView.ViewHolder(view) {
    val root = view?.rootView
}




override fun onBindViewHolder(holder: AlarmViewHolder?, position: Int) {
    var data = list[position]
    var days = data.days
    if(holder!=null) {
        whenAlarmActive(days, holder)
        holder.root?.time_start?.text = SimpleDateFormat("HH:mm").format(data.time)
        holder.root?.alarm_switch?.isChecked = data.isEnable
        holder.root?.id = data.id
        holder.root?.alarm_switch?.setOnCheckedChangeListener(checkedL)

    }
}



override fun getItemCount(): Int = list.size

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): AlarmViewHolder? {
    var view = LayoutInflater.from(parent?.context).inflate(R.layout.fragment_item_alarm,parent,false)
    var holder = AlarmViewHolder(view)
    return holder
}



private fun whenAlarmActive(days: BooleanArray, holder: AlarmViewHolder) {
    if(days.size !=7) return
    if(days[0] && days[1] && days[2] && days[3] && days[4] && !days[5] && !days[6]){
        holder.root?.weekdays?.visibility = View.VISIBLE
        holder.root?.weekend?.visibility = View.GONE
        setDaysVisibility(holder,View.GONE)
        return
    }

    if(!days[0] && !days[1] && !days[2] && !days[3] && !days[4] && days[5] && days[6]){
        holder.root?.weekdays?.visibility = View.GONE
        holder.root?.weekend?.visibility = View.VISIBLE
        setDaysVisibility(holder,View.GONE)
        return
    }

    days.forEachIndexed { i, b ->
        when(i){
            0 -> holder.root?.day1?.visibility = boolToIntVisibiblity(b)
            1 -> holder.root?.day2?.visibility = boolToIntVisibiblity(b)
            2 -> holder.root?.day3?.visibility = boolToIntVisibiblity(b)
            3 -> holder.root?.day4?.visibility = boolToIntVisibiblity(b)
            4 -> holder.root?.day5?.visibility = boolToIntVisibiblity(b)
            5 -> holder.root?.day6?.visibility = boolToIntVisibiblity(b)
            6 -> holder.root?.day7?.visibility = boolToIntVisibiblity(b)
        }
    }

}

private fun setDaysVisibility(holder: AlarmViewHolder, visibility:Int) {
    holder.root?.day1?.visibility = visibility
    holder.root?.day2?.visibility = visibility
    holder.root?.day3?.visibility = visibility
    holder.root?.day4?.visibility = visibility
    holder.root?.day5?.visibility = visibility
    holder.root?.day6?.visibility = visibility
    holder.root?.day7?.visibility = visibility
}

fun boolToIntVisibiblity(b:Boolean): Int = if(b) View.VISIBLE else View.GONE

fun addAlarm(alarm:AlarmItemListData){

    list.add(alarm)
//        sortAlarmList(list)
    notifyDataSetChanged()
}




private fun sortAlarmList(list:MutableList<AlarmItemListData>){
    list.sortBy { it.time?.time }
    notifyDataSetChanged()
}

override fun onViewRecycled(holder: AlarmViewHolder?) {
    super.onViewRecycled(holder)
}
}
Bleser
  • 1,758
  • выложите проблеммный код сюда – Vladyslav Matviienko Jun 20 '16 at 13:35
  • В конце сообщения есть ссылка на github - https://github.com/Bleser92/HeadsetAlarm – Bleser Jun 20 '16 at 13:38
  • 1
    Очень круто, но никто не станет рыться в целом проекте ради 10 строк проблеммного кода. Так что будьте добры, сделайте по правилам. – Vladyslav Matviienko Jun 20 '16 at 13:40
  • Решение вашей проблемы аналогично этому ответу скорее всего – pavlofff Jun 20 '16 at 14:04
  • Есть подозрение, что проблема в val root = view?.rootView. rootView - это похоже будет сам recyclerView, а не элемент. попробуйте написать val root=view. И почему вы начинаете знакомиться с андроидом с kotlin? Отвечающих и инфы вообще по java существенно больше, чем по kotlin. – Yura Ivanov Jun 20 '16 at 16:12
  • @YuraIvanov Kotlin по своей сути - синтетический сахар для Java, просто упрощает некоторые конструкции Java. Вся практика Java в равной степени применима и в Kotlin, тем более , что Kotlin позволяет свободно миксовать и Java-код в одном классе. В общем, никаких проблем с использованием этого языка и решениях на Java быть не может. – pavlofff Jun 20 '16 at 17:02
  • Я понял почему у меня работало все не так как нужно. В onBindViewHolder я навесил на switcher слушатель и при создании viewholder вызывался код внутри него. – Bleser Jun 20 '16 at 17:05
  • @pavlofff ну вы сами себе противоречите. другой вопрос, ссылку на который вы дали, очевидно о другом. И этот вопрос не является копией, но кому это интересно? Т.к. тут явно идет сохранение переключателей в данных. И судя по тому, что вы этого не разглядели за "сахаром", таки знания и ответы по java+android могут быть не только о другом, но и вообще неверными по android+kotlin из-за особенностей этого сахара. Я вот с ходу разобраться не смог, впрочем, так же как и вы. У меня код из вопроса, например, вообще не скомпилировался, даже после шаманств. – Yura Ivanov Jun 20 '16 at 17:23
  • @YuraIvanov C другой стороны, я не отмечал вопрос как копия (и даже был удивлен, когда его закрыли без комментария автора, что решение подходит), а в силу отсутствия компьютера и нормального интернета на тот момент, предложил автору рассмотреть наиболее вероятную причину проблем с чекаемыми элементами в адаптере. Так же, конкретно в этом коде нет никакого такого "сахара" или особенностей Kotlin (кроме автовыведения типов и блока when, смысл которого вполне понятен), чтобы можно было говорить о непонимании того, что там происходит, но на тот момент разбираться серьезно я действительно не мог. – pavlofff Jun 21 '16 at 02:28
  • @ЮрийСПб надо бы снять копию – pavlofff Jun 21 '16 at 02:29
  • @pavlofff, снял, но, как мне кажется было вполне нормально... Тут, насколько я понял, ТС восстанавливает статус чекнутости из виждета, что явно не верно. А после этого ещё и слушатель изменения чекнутости ставит... В итоге какой-то адЪ получается) Надо, конечно, из самой переменной data поле isEnabled брать и по нему статус ставить свитча – ЮрийСПб Jun 21 '16 at 08:48
  • @pavlofff, @YuraIvanov Порылся в коде нашел баг с получением ID, всегда выдавался один и тот же, но ошибка с изменением состояния Switch осталась – Bleser Jun 21 '16 at 15:13

1 Answers1

1

Нашел из за чего не работало это просто магия)) Когда добавляли 3 элемента и у одного из них в Switch меняли состояние(нажимали на него) и забивали экран до конца остальные свичи либо принимали такое же состояние как и первый свитч[1] или или он становился как другие[2]. Потратив кучу времени я понял что в модели каким то образом изменяется переменная isEnable в нее ставится true[2] или false[1] в зависимости от событий хотя эта переменная была приватна и сеттер имел не стандартное имя. Заменив boolean на int и потом преобразовывая обратно в boolean все заработало(тот еще костыль=)))

Bleser
  • 1,758