在设置TextView RecylcerView

时间:2018-11-24 16:51:26

标签: java android android-recyclerview textview spannable

我有一个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的建议?

1 个答案:

答案 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对其进行引用时。