Android DataBinding/Recyclerview - установите пользовательский диапазон для просмотра текста с помощью SpannableBuilder
Я мигрирую из старого ListView
в RecyclerView
в моем проекте. Я решил использовать привязку данных для привязки значений списка, но у меня возникли некоторые проблемы с настройкой диапазона текста для моего текстового поля.
Пожалуйста, посмотрите на этот кусок кода (вот как это делается со старым адаптером ListBox):
@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);
}
Проблема: categoryText
всегда ноль. Есть идеи? TextView привязан правильно, потому что без пользовательской функции он отображает текст так, как должен.
Мой список адаптеров:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>
{
public List<Event> events = null;
private final ListFragment.OnFragmentInteractionListener mListener;
public ListAdapter(List<Event> events, ListFragment.OnFragmentInteractionListener mListener)
{
this.events = events;
this.mListener = mListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
{
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.cell, viewGroup, false);
return new ViewHolder(binding);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position)
{
final Event event = events.get(position);
viewHolder.bind(event);
viewHolder.binding.getRoot().setOnClickListener(v ->
{
if (null != mListener)
{
mListener.onFragmentInteraction(event);
}
});
}
@Override
public int getItemCount()
{
return events.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder
{
private final ViewDataBinding binding;
public ViewHolder(ViewDataBinding binding)
{
super(binding.getRoot());
this.binding = binding;
}
public void bind(Object obj)
{
binding.setVariable(BR.data,obj);
binding.executePendingBindings();
}
}
}
1 ответ
Используйте пользовательский атрибут, например:
В 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);
}
myCustomFunction(..)
будет вызываться при создании Textview из XML. Вы можете использовать свою пользовательскую функцию, чтобы установить Span на ваш вид.