[英]Kotlin RecyclerView DataBindingAdapter I do not know why I get the error
我想結合imageview與數據bindingadapter。 我正在Google搜索有關我的問題的信息。 問題是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`
}
}
我將這段代碼移到了另一個類,例如mainactivity,listadapter,但它不起作用。
我按照其他有關數據綁定適配器的視頻或文檔中的描述編寫了代碼。
嘗試將圖像網址也傳遞給綁定適配器
@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}"
/>
還要檢查本指南
第一種解決方法:
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)。
override fun onBindViewHolder(holder: SampleViewHolder, position: Int) {
holder.binding.person = items[position]
holder.binding.executePendingBindings()
}
第二種解決方法:
您的網址可能使用http協議,而不是https。 在這種情況下,此鏈接可能會有所幫助: 畢加索是否不從http URL加載圖像,而是從https url加載圖像?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.