在ListView或RecyclerView的item中使用SpannableStringBuilder对TextView进行文本和图片的拼接造成item所获取宽度不对,导致item的显示内容不全

如标题所说的,我在开发直播间的消息列表功能时,遇到了需要将礼物图片和提示消息文本展示出来,然后在刷新插入的字符拼接图片的item时显示宽度的不对问,需要经过滑动才能获取正确宽度。
代码如下:

			spanString = new SpannableStringBuilder(sendName + " 送出" + item.getContent() +" ");
            spanString.setSpan(new ForegroundColorSpan(calcNameColor(sendName)),
                    0, sendName.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
            spanString.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.yellow)),
                    sendName.length(), spanString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

            Glide.with(mContext).load(item.getImage()) .override(DisplayUtil.dip2px(mContext,15), DisplayUtil.dip2px(mContext,15)).into(new CustomTarget<Drawable>() {
                @Override
                public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                    //替换最后一个字符为图片
                    SpannableStringBuilder span1 ;
                    spanString.setSpan(new ImageSpan(Objects.requireNonNull(resource)), spanString.length()-1, spanString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

                    // 改变礼物数量文本颜色
                    span1 = new SpannableStringBuilder("x"+item.getNum()+"");
                    span1.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.white)),
                            0, span1.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
                    spanString.append(span1);
                    holder.sendContext.setText(spanString);
                }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {

                }
            });

显示效果问题:
问题1,显示宽度不对
我的解决办法是:对需要进行拼接的图片资源在拼接前设置宽高大小

resource.setBounds(0, 0, resource.getIntrinsicWidth(), resource.getIntrinsicWidth());

加上这行代码之后显示,不会出现获取宽度不对的情况,但有出现新的问题,就是当文本长度刚好换行时会出现拼接的图片不显示的问题,效果如下:
刚好换行时图片不显示
我的解决办法是:把用来给图片替代拼接的占位空格字符换成"\uFFFC"

最后代码:

			spanString = new SpannableStringBuilder(sendName + " 送出" + item.getContent() +"\uFFFC");
            spanString.setSpan(new ForegroundColorSpan(calcNameColor(sendName)),
                    0, sendName.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
            spanString.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.yellow)),
                    sendName.length(), spanString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

            Glide.with(mContext).load(item.getImage()).into(new CustomTarget<Drawable>() {
                @Override
                public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                    //设置图片的大小
                    resource.setBounds(0, 0, resource.getIntrinsicWidth(), resource.getIntrinsicWidth());
                    //替换最后一个字符为图片
                    spanString.setSpan(new ImageSpan(Objects.requireNonNull(resource)), spanString.length()-1, spanString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                    // 改变礼物数量文本颜色
                    SpannableStringBuilder span1  = new SpannableStringBuilder("x"+item.getNum()+"");
                    span1.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.white)),
                            0, span1.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
                    spanString.append(span1);
                    holder.sendContext.setText(spanString);
                }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {

                }
            });

这是我开发直播间消息列表需要展示礼物赠送消息时所遇到的坑,记录一下,方便自己方便他人,第一次写博客,文笔不会请见谅。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值