Java Android数据绑定/回收视图-使用SpannableBuilder为textview设置自定义范围
我正在从项目中的旧Java Android数据绑定/回收视图-使用SpannableBuilder为textview设置自定义范围,java,android,android-recyclerview,android-databinding,spannablestringbuilder,Java,Android,Android Recyclerview,Android Databinding,Spannablestringbuilder,我正在从项目中的旧列表视图迁移到回收视图。我已决定使用数据绑定来绑定列表值,但在为文本框设置自定义文本范围时遇到了一些问题 请看这段代码(这是如何使用旧的ListBox adapater完成的): 基本上,myCustomTypeface span用于为单个TextView设置多个字体。如何使用数据绑定实现相同的功能?是否可以为此使用BindingAdapter 我的尝试: <variable name="categoryText" type="String"/> <varia
列表视图
迁移到回收视图
。我已决定使用数据绑定来绑定列表值,但在为文本框设置自定义文本范围时遇到了一些问题
请看这段代码(这是如何使用旧的ListBox adapater完成的):
基本上,myCustomTypeface span
用于为单个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"/>
问题: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();
}
}
}
公共类ListAdapter扩展了RecyclerView.Adapter
{
公共列表事件=null;
私有最终ListFragment.OnFragmentInteractionListener MLListener;
公共ListAdapter(列表事件,ListFragment.OnFragmentInteractionListener mListener)
{
这个事件=事件;
this.mListener=mListener;
}
@凌驾
public ViewHolder onCreateViewHolder(ViewGroup ViewGroup,int viewType)
{
LayoutInflater LayoutInflater=LayoutInflater.from(viewGroup.getContext());
ViewDataBinding binding=DataBindingUtil.inflate(LayoutFlater,R.layout.cell,viewGroup,false);
返回新的视图持有者(绑定);
}
@凌驾
公共无效onBindViewHolder(ViewHolder ViewHolder,最终int位置)
{
最终事件=事件。获取(位置);
viewHolder.bind(事件);
viewHolder.binding.getRoot().setOnClickListener(v->
{
if(null!=mListener)
{
mListener.onFragmentInteraction(事件);
}
});
}
@凌驾
public int getItemCount()
{
返回事件。大小();
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder
{
私有最终视图数据绑定;
公共视图持有者(ViewDataBinding绑定)
{
super(binding.getRoot());
这个。绑定=绑定;
}
公共无效绑定(对象obj)
{
binding.setVariable(BR.data,obj);
binding.executePendingBindings();
}
}
}
使用自定义属性,如: 在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}"
/>
当从xml创建Textview时,将调用myCustomFunction(..)。您可以使用自定义函数设置视图的跨度。调用了自定义函数,但
name
参数对我来说总是为空。我更新了我的问题。不是活动绑定,而是RecyclerView(我不知道这是否重要)通过binding.setCategoryText(“value”)方法将值设置为categoryText变量。setCategoryText()方法将在您在XML内部的变量标记中声明变量时自动创建检查此链接以了解将绑定放置在何处的详细信息。setCategoryText(“值”)
您是指ViewHolder吗?我看了你贴的文件,但我还是不知道出了什么问题。问题已更新,添加了列表适配器代码将该代码放入onCreateViewHolder()函数中的“ViewDataBinding binding=DataBindingUtil.inflate(layoutInflater,R.layout.cell,viewGroup,false);”这一行之后
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();
}
}
}
<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);
}