Как удалить 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)
}
}
}