ImageView не загружает изображения в RecyclerView после привязки URL - PullRequest
0 голосов
/ 03 мая 2019

Я новичок с привязкой данных Android, но ImageView не привязывается в RecyclerView.Я прочитал несколько блогов, но не повезло.Чего мне не хватает?

Ниже приведены некоторые из прочитанных мной постов в блоге:

ссылка 1

ссылка2

Ниже описан стиль моего макета * 1013.

<?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 Ответ

1 голос
/ 03 мая 2019

Во-первых, при привязке отсутствует владелец жизненного цикла (т. Е. Действие или фрагмент, в котором вы используете адаптер).Вы должны передать его в свой адаптер и затем установить его:

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
}

(Обратите внимание, что здесь я удалил код, который вы написали, чтобы изменить заголовок вашего текстового представления, потому что вы должны изменить его черезпривязка данных в макете выполняется следующим образом: android:text="@{movie.mTitle}".)

С этими изменениями ваша реализация должна работать!

...