带有 onClicklistener 的 ViewHolder 问题与 UninitializedPropertyAccessException

ViewHolder with onClicklistener Issue with UninitializedPropertyAccessException

我是初学者,请多多指教。

我有一个带有 onclicklistener 的查看器。

点击的目的是使用 Jetpack Navigation 将 Url 字符串发送到另一个片段中(希望我做对了)

Url 正在数据class 本身中创建。

但我一直收到此错误:

kotlin.UninitializedPropertyAccessException: lateinit property galleryItem has not been initialized

我试过使用伴随对象和其他方法,但没有任何效果...有解决方案吗?

这里是视图持有者和数据class

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import androidx.core.os.bundleOf
import androidx.navigation.Navigation
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.saheralsous.android.R
import com.saheralsous.android.database.remote.model.PagingData

class RecyclerViewPhotoAdapter() :
    PagingDataAdapter<PagingData.GalleryItem, PhotoHolder>(
        diffCallback = DiffCallback
    ) {
    override fun onBindViewHolder(holder: PhotoHolder, position: Int) {
        getItem(position)?.let {
            holder.bind(it)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.photo_item_view,parent,false)
        return PhotoHolder(view)
    }
}

class PhotoHolder(view: View):
    RecyclerView.ViewHolder(view), View.OnClickListener {
    
    private val imageButtom: ImageButton = view.findViewById(R.id.ImageButton)
    private lateinit var galleryItem: PagingData.GalleryItem //page. 594


    @SuppressLint("ResourceType")
    fun bind(galleryItem : PagingData.GalleryItem){
        /*
        idTextView.text = galleryItem.id
        ownerTextView.text = galleryItem.owner
        titleTextView.text = galleryItem.title
        urlTextView.text = galleryItem.url
         */
        galleryItem.url.let { url ->
            Glide.with(itemView)
                .load(url)
                .override(350,350)
                .into(imageButtom)
        }
    }

    init {
        imageButtom.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        println("item was clicked")
        val bundle = bundleOf("url" to galleryItem.photoPageUri )  <-- here is the issue
        Navigation.findNavController(v!!).navigate(
            R.id.action_photoGalleryFragment_to_photoPageFragment,
            bundle)
    }
}




object DiffCallback : DiffUtil.ItemCallback<PagingData.GalleryItem>() {

    override fun areItemsTheSame(oldItem: PagingData.GalleryItem, newItem: PagingData.GalleryItem): Boolean {
        // Id is unique.
        return oldItem.id == newItem.id
    }

    override fun areContentsTheSame(oldItem: PagingData.GalleryItem, newItem: PagingData.GalleryItem): Boolean {
        return oldItem == newItem
    }
}

数据class


import android.net.Uri
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName

data class PagingData(
    val total : Int =0,
    val Page: Int = 0,
    val photos : List<GalleryItem>
){
    val endOfPage = total == Page

    @Keep
    data class GalleryItem(
        @SerializedName("id")
        val id: String,
        @SerializedName("owner")
        val owner: String,
        @SerializedName("title")
        var title: String,
        @SerializedName("url_s")
        val url: String) {
        val photoPageUri : Uri <-- here is the value
            get() {
                return Uri.parse("https://www.flickr.com/photos/")
                    .buildUpon()
                    .appendPath(owner)
                    .appendPath(id)
                    .build()
            }
    }
}

如错误所述,您尚未在 PhotoHolder 中初始化 galleryItem 实例变量。将此添加到您的 bind 方法中:

this.galleryItem = galleryItem