首页 > 解决方案 > 提高设置 TextView RecyclerView 的跨度/可跨度性能

问题描述

我有一个RecyclerView带有多个TextViews. 其中一个由 , 通过从 中提取的标记TextViews填充。在阅读了 Florina Muntenescu 的教程后,我意识到我可以通过使用. 我最大的问题是她的代码是用写的(我还没到那里)。SpannedStringArrayList<Object>Spannable FactoryKotlin

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

假设我们要重用 aTextView并多次设置文本,比如在 a 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 的建议?

标签: javaandroidandroid-recyclerviewtextviewspannable

解决方案


在java中,您应该只覆盖 method newSpannable,在其实现中将源(CharSequence)转换为 Spannable 并将此工厂设置为TextView(在我的情况下为 tvText)

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

请记住,它应该从构造函数设置,而不是. 当您通过.ViewHolder's onBindViewHolderfindViewById


推荐阅读