Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android数据绑定/回收视图-使用SpannableBuilder为textview设置自定义范围_Java_Android_Android Recyclerview_Android Databinding_Spannablestringbuilder - Fatal编程技术网

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完成的):

基本上,my
CustomTypeface 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);
}