提高 spanned/spannable 设置 TextView RecyclerView 的性能

Improving spanned/spannable performance in setting TextView RecylcerView

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

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

Let’s say that we want to reuse a TextView and set the text multiple times, like in a RecyclerView.ViewHolder...

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

Set the Spannable.Factory object once right after you get a reference to your TextView. If you’re using a RecyclerView, do this when you first inflate your views.

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 中,您应该只覆盖方法 newSpannable,在其实现中将源 (CharSequence) 转换为 Spannable 并将此工厂设置为 TextView(在我的例子中为 tvText)

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

请记住,它应该是 set 来自 ViewHolder's constructor,not onBindViewHolder。当您通过 findViewById.

引用它时