【问题标题】:Improving spanned/spannable performance in setting TextView RecylcerView提高设置 TextView RecyclerView 的跨度/可跨度性能
【发布时间】:2018-11-24 16:51:25
【问题描述】:

我有一个RecyclerView 和多个TextViews。其中一个TextViews 填充有Spanned,通过从ArrayList<Object> 提取的标记String。在阅读了 Florina Muntenescu 的 this 教程后,我意识到我可以通过使用 Spannable Factory 来提高我的性能。我最大的问题是她的代码是用Kotlin 编写的(我还没到那里)。

据我所知,这是关键信息,

假设我们要重用 TextView 并多次设置文本,例如 RecyclerView.ViewHolder...

val spannableFactory = object : Spannable.Factory() {
    override fun newSpannable(source: CharSequence?): Spannable {
        return source as Spannable
    }
}`

在你得到一个之后立即设置Spannable.Factory 对象 参考您的 TextView。如果您使用的是 RecyclerView,请执行此操作 当你第一次夸大你的观点时。

textView.setSpannableFactory(spannableFactory)

所以,假设我有这个简单的RecyclerView adapter 设置一个Spanned TextView

@Override
public void onBindViewHolder(RecyclerViewHolder rvh, int position){

    String string =arrayList.get(position).getValue();
    Spanned spanned = getSpannedValue(string);
    rvh.tv.setText(spanned);
}

如何更改我的代码以利用 Florina 的建议?

【问题讨论】:

    标签: java android android-recyclerview textview spannable


    【解决方案1】:

    在 java 中,你应该重写方法 newSpannable,在其实现中将源 (CharSequence) 转换为 Spannable,并将此工厂设置为 TextView(在我的情况下为 tvText)

           tvText.setSpannableFactory(new Spannable.Factory(){
                @Override
                public Spannable newSpannable(CharSequence source) {
                    return (Spannable) source;
                }
            });
    

    请记住,它应该是从ViewHolder's 构造函数设置不是 onBindViewHolder。当您通过findViewById 获得参考时。

    【讨论】:

    • 谢谢,所以我找到ViewByID,然后添加您的代码,然后setText...全部在ViewHolder 中。对吗?
    • 糟糕,我的意思是找到ViewByID,然后在ViewHolde 构造函数中添加您的代码。并在 onBIndViewHolder 中设置文本
    • 我们应该在哪里写 setSpan? SpannableFactory 如何减少对象创建次数?
    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2019-01-21
    • 2019-05-12
    相关资源
    最近更新 更多