我有一个RecyclerView
,其中有多个TextViews
。通过从TextViews
提取的标记Spanned
,在String
中填充一个ArrayList<Object>
。阅读了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的建议?
答案 0 :(得分:2)
在Java中,您应该只覆盖方法newSpannable
,在其实现中将源(CharSequence)强制转换为Spannable,并将此工厂设置为TextView
(在我的情况下为tvText)
tvText.setSpannableFactory(new Spannable.Factory(){
@Override
public Spannable newSpannable(CharSequence source) {
return (Spannable) source;
}
});
请紧记,应该从ViewHolder's
的构造器中设置,而不是不 onBindViewHolder
。当您通过findViewById
对其进行引用时。