提高 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
.
引用它时
我有一个 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 aRecyclerView.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
.