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

时间:2019-05-03 16:12:27

标签: android kotlin android-glide android-databinding

我是使用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>

然后这是包含所有属性的模态类:

@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 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
            }
        }
    }
}

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

1 个答案:

答案 0 :(得分:1)

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

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
}

(请注意,这里我删除了您编写的用于更改textview标题的代码,因为您应该通过执行以下操作通过布局中的数据绑定来更改它:android:text="@{movie.mTitle}"。)

有了这些更改,您的实现有望实现!