0

我想将 imageview 与数据绑定适配器结合起来。我在谷歌上搜索我的问题。问题是 databindingadapter 在我的 XML 中不起作用。

说的简单点,其他的视图识别得很好,比如textView。如果我在 ImageView 输入变量名,颜色应该会改变,但不会改变。

这是我的代码 <data class> (databindingadapter)

import android.net.Uri
import android.widget.ImageView
import androidx.databinding.BindingAdapter
import com.squareup.picasso.Picasso

class Person {

val name = ""
val age = ""
var image = ""

}

object imageBindingAdapter {

val person = Person()

@JvmStatic
@BindingAdapter("image")
fun bindImage(imageView: ImageView) {

    Picasso.get().load(Uri.parse(person.image))
        .fit().centerCrop().into(imageView)


}

}

XML 代码

<?xml version="1.0" encoding="utf-8"?>
<layout>

<data>

    <variable name="person" 
type="com.example.kotlinerecyclerview.Person"/>

</data>

<androidx.constraintlayout.widget.ConstraintLayout 
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"

android:layout_width="match_parent"

android:layout_height="wrap_content"
>

    <ImageView android:layout_width="100dp" android:layout_height="100dp"
               app:layout_constraintTop_toTopOf="parent"
               app:layout_constraintEnd_toEndOf="parent"
               android:src="@android:drawable/btn_default"
               app:image="person.image"
    />

    <TextView
            android:text="@{person.name}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_name"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
    <TextView
            android:text="@{String.valueOf(person.age)}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toBottomOf="@+id/tv_name"
            app:layout_constraintStart_toStartOf="parent"
            android:id="@+id/tv_age"/>
</androidx.constraintlayout.widget.ConstraintLayout>

</layout>

这是我的 recyclerview 适配器类

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.kotlinerecyclerview.databinding.ItemBinding


class ListAdapter(val items: List<Person>, private val clickListener: 
(person: Person) -> Unit) :
RecyclerView.Adapter<ListAdapter.SampleViewHolder>() {

class SampleViewHolder(val binding: ItemBinding) : 
RecyclerView.ViewHolder(binding.root)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
SampleViewHolder {

    val view = LayoutInflater.from(parent.context)
        .inflate(R.layout.item, parent, false)
    val holder = SampleViewHolder(ItemBinding.bind(view))

    view.setOnClickListener {
        clickListener.invoke(items[holder.adapterPosition])

    }


    return holder
}


override fun getItemCount() = items.size

override fun onBindViewHolder(holder: SampleViewHolder, position: Int) {
    holder.binding.person = items[position]`enter code here`
}


}

我将此代码移至另一个类 ex) mainactivity,listadapter,但它不起作用。

我编写了其他有关数据绑定适配器的视频或文档中描述的代码。

4

2 回答 2

0

第一种解决方法:

  1. 在单独的文件中移动绑定适配器并添加“app:”

ImageViewBindings.java

@BindingAdapter("app:image")
fun setImage(view: ImageView, url: String) {
   Picasso.get().load(url).fit().centerCrop().into(view)
}
<ImageView 
    android:layout_width="100dp" 
    android:layout_height="100dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    android:src="@android:drawable/btn_default"
    app:image ="person.image"/>

android:src 和 app:image 尝试做同样的事情。这可能是冲突的原因。如果您的意图是设置多个图像,请考虑将它们分开(例如到 2 个不同的 ImageView)。

  1. person.image 不是 ObservableField 所以你应该使用 executePendingBindings 之类的
override fun onBindViewHolder(holder: SampleViewHolder, position: Int) {
    holder.binding.person = items[position]
    holder.binding.executePendingBindings()
}

第二种解决方法:

您的网址可能使用 http 协议,而不是 https。在这种情况下,此链接可能会有所帮助:Picasso not loading image from http url but loading images from https url?

于 2019-08-01T16:38:00.960 回答
0

尝试将图像 URL 也传递给绑定适配器

@JvmStatic
@BindingAdapter("image")
fun bindImage(imageView: ImageView, url: String) {

    Picasso.get().load(url)
        .fit().centerCrop().into(imageView)
}

还要更改您的xml,如下所示

<ImageView android:layout_width="100dp" android:layout_height="100dp"
           app:layout_constraintTop_toTopOf="parent"
           app:layout_constraintEnd_toEndOf="parent"
           android:src="@android:drawable/btn_default"
           app:image="@{person.image}"
    />

也检查本指南

于 2019-08-01T15:57:16.850 回答