在使用databinding
时,我们经常会遇到需要对图片进行自定义的属性添加,以实现网络图片的自动加载和处理,这种处理在java
中的话在对应的ViewModel
中添加静态方法,就可以实现对应的处理,但是迁移到Kotlin
之后,你会发现这种方法不好用了,那么我们应该怎么办呢?
如下面的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.ziank.novelreader.activities.BookPageActivity">
<data>
<variable
name="book"
type="com.ziank.novelreader.view_models.BookPageViewModel"/>
</data>
...
<ImageView
android:id="@+id/book_cover"
android:layout_width="80dp"
android:layout_height="100dp"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
app:imageUrl="@{book.coverUrl}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar"
app:srcCompat="@drawable/booklist" />
...
</xml>
对于book
的封面,我们新增了一个属性为imageUrl
的属性,值绑定到了book.coverUrl
,那么我们就需要新增一个方法对它进行处理。由于直接在ViewModel
中添加方法不可用,我们就用到了DataBindingComponent
了。DataBindingComponent
用在生成DataBinding
时,也就是绑定view
之时,此时可以指定使用我们生成的DataBindingComponent
的子类对象,而在DataBindingComponent
中处理新增属性的处理。
如下面的所示:
class MyComponent:DataBindingComponent {
override fun getMyComponent(): MyComponent {
return MyComponent()
}
@BindingAdapter("imageUrl")
fun loadImage(view: ImageView, imageUrl: String) {
Picasso.with(view.context)
.load(imageUrl)
.placeholder(R.drawable.book_cover)
.into(view)
}
}
在生成DataBinding
的时候代码如下:
val binding = DataBindingUtil.setContentView<ActivityBookPageBinding>(this, R.layout
.activity_book_page, MyComponent.getMyComponent())
binding.book = mBookModel
这样就可以实现对于封面的处理了。其实主要就是对于DataBindingComponent
的使用,只要掌握了对应的使用,就可以理解我们对于新增属性的处理。