簡體   English   中英

Kotlin RecyclerView DataBindingAdapter我不知道為什么會收到錯誤

[英]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}"
    />

還要檢查本指南

第一種解決方法:

  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。 在這種情況下,此鏈接可能會有所幫助: 畢加索是否不從http URL加載圖像,而是從https url加載圖像?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM