Как удалить Spannables из текста CheckBox?

Я добавил удар в CompoundButton. Суть того, как я добавляю зачеркнутый:

fun CompoundButton.addStrikeThrough() {
    val span = SpannableString(text)
    span.setSpan(
        StrikethroughSpan(),
        0,
        text.length,
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    text = span
}

Я использую Spannable, потому что я не всегда хочу, чтобы весь текст был вычеркнут. CompoundButton - это на самом деле CheckBox, который просматривает текст при проверке. Я использую вышеупомянутый метод в списке элементов CheckBox и устанавливаю слушателя внутри onBindViewHolder.

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val todoText = todos[position]
    holder.checkBox.apply {
        isChecked = false
        text = todoText
        setOnCheckedChangeListener { checkBox, isChecked ->
            if (isChecked) {
                checkBox.addStrikeThrough()
            } else {
                // how do I write this?
                checkBox.removeStrikeThrough()
            }
        }
    }
}

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

Как удалить зачеркнутый из CheckBox?

Я попытался получить текст из CheckBox и привести его к Spannable и SpannableString, чтобы я мог вызвать removeSpan(), но текст никогда не является экземпляром ни одного из этих двух классов.

Я видел один или два вопроса, которые примерно одинаковы, но их ответы не работают.

1 ответ

Решение

Вы можете немного изменить свой код и получить что-то вроде этого:

fun CompoundButton.setText(buttonText: String, withStrike: Boolean) {

    text = if (withStrike) {
        val span = SpannableString(buttonText)
        span.setSpan(
                StrikethroughSpan(),
                0,
                text.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )
        span
    } else {
        buttonText
    }
}

И в вашем адаптере:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val todoText = todos[position]
    holder.checkBox.apply {
        isChecked = false
        text = todoText
        setOnCheckedChangeListener { checkBox, isChecked ->
            checkBox.setText(todoText, isChecked)
        }
    }
}
Другие вопросы по тегам