绑定 Url 后,ImageView 不会在 RecyclerView 中加载图像

ImageView doesn't load images in the RecyclerView after binding the Url

我是 android 数据绑定的新手,但是 ImageView 没有在 RecyclerView 中绑定。我已经阅读了几篇博客,但没有运气。我错过了什么?

以下是我读过的一些博文:

link 1

link2

下面是我如何设计我的 xml 布局。

<?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">

    <data>
        <variable
            name="movie"
            type="com.movieapp.huxymovies.model.Result" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:background="@color/bg"
        android:orientation="vertical">
        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:cardCornerRadius="4dp">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="0dp"
                android:layout_marginTop="8dp"
                android:background="@color/bg"
                android:orientation="horizontal">
                <ImageView
                    android:id="@+id/img"
                    android:layout_width="70dp"
                    android:layout_height="100dp"
                    android:layout_marginLeft="8dp"
                    app:movieImage="@{movie.MPosterPath}" />
                </LinearLayout>
            </LinearLayout>
        </android.support.v7.widget.CardView>
    </LinearLayout>
</layout>

那么这是包含所有属性的模态class:

@Entity(tableName = "Results")
class Result {

    companion object {

        @JvmStatic
        @BindingAdapter("movieImage")
        fun LoadImage(view: View, mPosterPath: String?) {
            val imageView = view as ImageView
            Glide.with(view.context)
                    .load(Utils.IMAGE_BASE_URL + mPosterPath)
                    .into(imageView)
        }


        @BindingAdapter("rating")
        fun setRating(ratingBar: RatingBar, rating: Float) {
            if (rating != null) {
                ratingBar.rating = rating
            }

        }
    }

    constructor(mId: Long?, mOverview: String?, mPosterPath: String?, mTitle: String?, mVoteAverage: Double?) {
        this.mId = mId
        this.mOverview = mOverview
        this.mPosterPath = mPosterPath
        this.mTitle = mTitle
        this.mVoteAverage = mVoteAverage
    }

    constructor()

    @PrimaryKey
    @SerializedName("id")
    var mId: Long? = null
    @SerializedName("overview")
    var mOverview: String? = null
    @SerializedName("poster_path")
    var mPosterPath: String? = null
    @SerializedName("title")
    var mTitle: String? = null
    @SerializedName("vote_average")
    var mVoteAverage: Double? = null
}

最后,在我的适配器 class 中,我尝试绑定项目布局。

class ResultAdapter(private val context: Context) : PagedListAdapter<Result, ResultAdapter.ResultViewHolder>(DIFF_CALLBACK) {

    public lateinit var mBinding: ItemActivitymainBinding
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResultViewHolder {
        mBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_activitymain, parent, false)
        return ResultViewHolder(mBinding)
    }

    override fun onBindViewHolder(holder: ResultViewHolder, position: Int) {
        val result = getItem(position)
        if (result != null) {
            holder.itemActivitymainBinding.titleTxt.text = result.mTitle
        }
    }

    class ResultViewHolder(itemView: ItemActivitymainBinding) : RecyclerView.ViewHolder(itemView.root) {
        var itemActivitymainBinding: ItemActivitymainBinding
        var root: View

        init {
            root = itemView.root
            itemActivitymainBinding = itemView
        }
    }

    companion object {

        const val MOVIE_ID = "MOVIE_ID"
        const val MOVIE_NAME = "MOVIE_NAME"
        const val MOVIE_OVERVIEW = "MOVIE_OVERVIEW"

        private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Result>() {
            override fun areItemsTheSame(oldItem: Result, newItem: Result): Boolean {
                return oldItem.mId === newItem.mId
            }

            override fun areContentsTheSame(oldItem: Result, newItem: Result): Boolean {
                return oldItem == newItem
            }
        }
    }
}

现在我仍然想知道为什么图像不显示,因为我已经阅读了一些关于此的博客文章并且我遵循了他们的所有程序。

首先,您的绑定缺少其生命周期所有者(即,activity 或您在其中使用适配器的片段)。你应该将它传递给你的适配器然后设置它:

class ResultAdapter(private val lifecycleOwner: LifecycleOwner) 
    : PagedListAdapter<Result, ResultAdapter.ResultViewHolder>(DIFF_CALLBACK) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResultViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        val binding = DataBindingUtil.inflate<ItemActivitymainBinding>(inflater, R.layout.item_activitymain, parent, false)

        // We set the lifecycle owner here
        binding.setLifecycleOwner(lifecycleOwner)

        return ResultViewHolder(binding)
    }

    ...
}
// In your activity/fragment, pass the view as a parameter when creating the adapter
adapter = ResultAdapter(this)

(在适配器中,我删除了 属性 mBinding 和构造函数参数 context,因为它们都不是必需的。)

其次,您在布局中定义了 属性 movie,但您并未为其设置实际值。要解决此问题,您必须更新 onBindViewHolder():

的实现
override fun onBindViewHolder(holder: ResultViewHolder, position: Int) {
    val movie = getItem(position)

    // Here we set the layout variable "movie" with its corresponding value
    holder.itemActivitymainBinding.movie = movie
}

(请注意,我在这里删除了您为更改文本视图的标题而编写的代码,因为您应该通过 data-binding 在布局中更改它,方法是:android:text="@{movie.mTitle}"。)

进行这些更改后,您的实施应该会奏效!