➤ Jetpack 笔记 使用DataBinding

昨天学习了LifeCycle ViewModel LiveData,今天学习一下DataBinding

使用DataBinding 的意义
让布局文件承担了原属于页面的工作,使页面布局耦合度进一步降低

DataBinding的优势
不在需要findViewById,项目更加简洁,可读性更高。
布局文件可以包含简单的业务逻辑。

在这里插入图片描述

使用DataBinding
在 build.gradle 文件中配置 在defaultConfig方法下

dataBinding{
    enabled = true
}

DataBinding 意义与应用

xml 文件中按住alt+回车 生成data,Idol 是实体类,idol可以理解为对象

<data>
    <variable
        name="idol"
        type="com.example.databing.Idol" />
    <variable
        name="eventHandle"
        type="com.example.databing.EventHandleListener" />
    <import type="com.example.databing.StartUtils" />
</data>

TextView 展示

<TextView
    android:id="@+id/tv_two"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="@{StartUtils.getStar(idol.start)}"
    android:textColor="#333"
    android:textSize="15sp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tv_one"
    tools:text="评分" />

Activity 相关代码

ActivityDataBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_data);
Idol idol = new Idol("洛洛亚索隆",2);
binding.setIdol(idol);

加载网络/本地图片

//java 代码
public class ImageViewBindingAdapter {
    @BindingAdapter("image")
    public static void setImage(ImageView imageView, String url){
        if(!TextUtils.isEmpty(url)){
            Picasso.get()
                    .load(url)
                    .placeholder(R.drawable.ic_launcher_background)
                    .into(imageView);
        }else{
            imageView.setBackgroundColor(Color.GRAY);
        }
    }
}

xml 文件 type 指的是 name 对象的类型

<variable
    name="networkImage"
    type="String" />

ImageView
这个image 这个属性 一定要是 BindingAdapter 带注解的这个东西@BindingAdapter(“image”)
app:image=“@{networkImage}”

使用过RecycleView 绑定

Xml 中需要注意的 itemImage 属性为
ImageViewBindingAdapter 中 @BindingAdapter(“itemImage”)
在这里插入图片描述

ImageViewBindingAdapter 代码如下

public class ImageViewBindingAdapter {

    @BindingAdapter("itemImage")
    public static void setImage(ImageView imageView, String url){
        if(!TextUtils.isEmpty(url)){
            Picasso.get()
                    .load(url)
                    .placeholder(R.drawable.ic_launcher_background)
                    .into(imageView);
        }else{
            imageView.setBackgroundColor(Color.GRAY);
        }
    }
}

主要的绑定关系没有在activity中,而是在Item 中 ItemBinding

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    List<Idol> idols;

    public RecyclerViewAdapter(List<Idol> idols) {
        this.idols = idols;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //导入布局
        ItemBinding itemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item, parent, false);
        return new MyViewHolder(itemBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        Idol idol = idols.get(position);
        holder.itemBinding.setIdol(idol);
    }
    
    @Override
    public int getItemCount() {
        return idols.size();
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
        
        private ItemBinding itemBinding;
      
        public MyViewHolder(@NonNull ItemBinding itemBinding) {
            super(itemBinding.getRoot());
            this.itemBinding = itemBinding;
        }
    }
}

Kotlin RecycleView使用 DataBinding 的Adapter

自己练习的时候写的代码,让自己慢慢适应Kotlin

class StudentRecyclerViewAdapter(var items: List<Student>) :
    RecyclerView.Adapter<StudentRecyclerViewAdapter.ViewHolder>() {
    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): StudentRecyclerViewAdapter.ViewHolder {

        val itemBinding: ItemBinding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.context),
            R.layout.item,
            parent,
            false
        )
        return ViewHolder(itemBinding)
    }

    override fun getItemCount(): Int = items.size

    override fun onBindViewHolder(holder: StudentRecyclerViewAdapter.ViewHolder, position: Int) {
         holder.itemDataBindX.student = items[position]
    }

    class ViewHolder(itemBinding: ItemBinding) : RecyclerView.ViewHolder(itemBinding.root) {
        var itemDataBindX:ItemBinding = itemBinding
    }

    fun setStudents(students: List<Student>) {
        items = students
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值