Has*_*cuk 13 android kotlin android-databinding
我正在尝试使用数据绑定加载图像。但我从来没有克服它。我的问题在哪里?下面是我的代码和布局结构。
MyItemViewModel.kt
@BindingAdapter("imageUrl")
fun loadImage(view: RoundedImageView, url: String) = Glide.with(view.context).load(url).into(view)
Run Code Online (Sandbox Code Playgroud)
布局文件
<data>
<variable
name="viewModel"
type="com.myapp.app.ui.activity.albumlist.AlbumItemViewModel"/>
</data>
<com.makeramen.roundedimageview.RoundedImageView
android:layout_width="60dp"
android:id="@+id/ivRoundedAlbum"
android:layout_marginStart="@dimen/unit_20_dp"
app:riv_corner_radius="8dp"
app:imageUrl="@{viewModel.data.cover}"
android:layout_height="60dp"/>
Run Code Online (Sandbox Code Playgroud)
您需要使url参数可以为空,并像这样防止空值:
@BindingAdapter("imageUrl")
fun loadImage(view: RoundedImageView, url: String?) {
if (!url.isNullOrEmpty()) {
.....
}
}
Run Code Online (Sandbox Code Playgroud)
BindingAdapter
方法应该是static,因此@JvmStatic
在这种情况下标记它会有所帮助。
但这会产生“编译时错误”,即“方法在类内不能是静态的”,因此应将其移至伴随对象或命名对象。
在您的情况下,您在类成员级别拥有方法,因此将其移动到伴随对象会有所帮助。因此,对于MyItemViewModel.kt
make 伴随对象和移动方法,如下所示:
class MyItemViewModel{
//Some code
companion object {
@JvmStatic
@BindingAdapter("imageUrl")
fun loadImage(view: RoundedImageView, url: String) { // This methods should not have any return type, = declaration would make it return that object declaration.
Glide.with(view.context).load(url).into(view)
}
}
//Some other code
}
Run Code Online (Sandbox Code Playgroud)
注意:还要删除带有
=
. 绑定方法应该有返回类型Unit
。
编辑:也可以使用Glide.with(view)
@hmac 在评论中建议的方法,但是......
使用前需要考虑的事项Glide.with(view)
:
在从 Activity/Fragment 使用它之前,应该附加您的视图。此方法的最佳用例是自定义视图/视图组。
在使用此方法之前考虑布局层次结构,因为不鼓励使用该方法的嵌套/大型层次结构布局过多。这种布局变得低效。
另请注意,如果视图在不支持的片段类中或上下文属于不支持的片段,则可能会产生嘈杂的日志,如文档所示,请 在使用此方法之前先迁移到支持库(现在被视为 AndroidX)!
归档时间: |
|
查看次数: |
10410 次 |
最近记录: |