【问题标题】:SpannableStringBuilder not display image span for every data from Firebase (Kotlin)SpannableStringBuilder 不显示来自 Firebase (Kotlin) 的每个数据的图像跨度
【发布时间】:2020-09-08 06:51:36
【问题描述】:

我从 FireBase 检索数据并尝试在每个数据 (TextView) 旁边显示图像。但是图像只显示在第一个数据上。

这是输出:

我希望每个数据都有一个图像。

这是我的代码:

val database = FirebaseDatabase.getInstance().reference

val getData = object : ValueEventListener {
     override fun onDataChange(snapshot: DataSnapshot) {
     
          val myData = SpannableStringBuilder()

          for (i in snapshot.children) {
               val data = i.child("myData").value

               myData.append("$data\n\n")
               
               // Get image from drawable and set size
               val drawable: Drawable? = context?.let { ContextCompat.getDrawable(it, R.drawable.myImage) }
               drawable?.setBounds(0, 0, textView.lineHeight, textView.lineHeight)
               
               // Set image span to the first letter
               val span: ImageSpan? = drawable?.let { ImageSpan(it, ImageSpan.ALIGN_BASELINE) }
               myData.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
          }

          textView.text = myData
     }

     override fun onCancelled(error: DatabaseError) {

     }
}

database.addValueEventListener(getData)

【问题讨论】:

    标签: java android kotlin stringbuilder spannablestring


    【解决方案1】:

    问题出在myData.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)。 您始终将图像跨度设置在整个字符串的第一个。做这样的事情:

    override fun onDataChange(snapshot: DataSnapshot) {
    
        val builder = SpannableStringBuilder()
    
        snapshot.children.forEach { data ->
            builder.append("$data#") // the `#` doesn't mind and will be replaced with the image span
    
            val span = context?.let {
                ImageSpan(it, R.drawable.myImage, DynamicDrawableSpan.ALIGN_BASELINE)
            }
    
            builder.setSpan(
                span,
                builder.length - 1,
                builder.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
    
            builder.append("\n\n") // at the end, append new lines
        }
        
        textView.text = builder
    }
    

    【讨论】:

    • 成功了,每个数据都有一个图像。但不得不做myData.length - 3, myData.length - 2 ,我不知道为什么。另一个问题是图片需要替换最后一个字母。我怎样才能把它放在最后一个字母旁边? @氨基摄影
    • 你的意思是要在每行末尾追加图片?
    • 是的,因为我没有找到其他方法将图像附加到每个数据旁边。
    • 我已对其进行了更改以满足您的要求。请尝试一下。
    • 完美!它工作得很好,满足了要求。我在这个网站上的第一个问题得到了非常准确和快速的回​​应。谢谢!
    猜你喜欢
    • 2019-05-24
    • 2018-08-30
    • 2021-09-11
    • 2018-02-09
    • 2021-09-20
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多