如何从CheckBox文本中删除Spannables?

时间:2018-03-29 16:26:14

标签: android android-checkbox spannable

我已经向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 个答案:

答案 0 :(得分: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)
        }
    }
}