Android DataBinding / Recyclerview - 使用SpannableBuilder为textview设置自定义范围

时间:2017-07-10 09:18:14

标签: java android android-recyclerview android-databinding spannablestringbuilder

我在项目中从旧if(objForm.checkbox.checked) { console.log("the box is checked") } else { console.log("the box is not checked") } 迁移到ListView。我已经决定使用数据绑定来绑定列表值,但是我在为文本框设置自定义文本范围时遇到了一些问题。

请查看这段代码(这是旧的ListBox适配器的完成方式):

RecyclerView

基本上,我的@Override public View getView(int position, @Nullable View convertView, ViewGroup parent) { ... Typeface tf = Typeface.createFromAsset(convertView.getContext().getAssets(), "fonts/fontawesome.ttf"); SpannableStringBuilder textCategory = new SpannableStringBuilder((item != null ? item.getCategoryIconName() : null) + " " + item.getCategoryName()); textCategory.setSpan (new CustomTypefaceSpan("", tf), 0, 1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); viewHolder.eventCategory.setText(textCategory); ... } 用于为单个CustomTypeFaceSpan设置多种字体。如何使用数据绑定实现相同的功能?可以使用TextView吗?

我的尝试:

BindingAdapter

绑定适配器:

<variable name="categoryText" type="String"/>
<variable name="data" type="Event"/>

<TextView
                android:id="@+id/event_category_text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="32dp"
                android:layout_marginRight="8dp"
                android:layout_marginTop="16dp"
                android:paddingBottom="3dp"
                android:paddingTop="3dp"
                android:text="@{data.categoryIconName + data.categoryName}"
                android:textAppearance="@style/TextAppearance.AppCompat.Body2"
                android:textColor="@color/colorEventCategoryText"
                app:customFunction="@{categoryText}"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

问题:@BindingAdapter({"customFunction"}) public static void setSpan(TextView textView, String categoryText) { Typeface tf = Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/fontawesome.ttf"); SpannableStringBuilder textCategory = new SpannableStringBuilder(categoryText); textCategory.setSpan (new CustomTypefaceSpan("", tf), 0, 1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); textView.setText(textCategory); } 始终为空。有任何想法吗? TextView被正确绑定,因为没有自定义函数它会显示文本。

我的列表适配器:

categoryText

1 个答案:

答案 0 :(得分:2)

使用自定义属性,如:

在xml中:

<data>
  <variable
      name="name"
      type="String"></variable>
</data>
........
  <TextView
     android:id="@+id/textView2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_margin="20dp"
     app:customFunction="@{name}"
    />

在活动类

.............
ActivityMainBinding binding = DataBindingUtil........
binding.setName("Something");
...................
@BindingAdapter("customFunction")
public static void myCustomFunction(TextView textView, String name){
    Log.d("MainActivity", "custom function called");
    String nameCaps = name.toUpperCase();
    textView.setText(nameCaps);
}
从xml创建Textview时将调用

myCustomFunction(..)。您可以使用自定义功能将Span设置为您的视图。