未解决的参考:recyclerView 适配器中的 findViewById

Unresolved reference: findViewById in recyclerView adapter

我必须使用要加载图像的 imageView。因此,要使用我正在使用 findViewId 的 imageView,但它给出了一个错误:未解析的引用:findViewById。 imageView 的 id 是 ivArticleImage

NewsAdapter.kt:

package com.example.newsapp_mvvm.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.newsapp_mvvm.R
import com.example.newsapp_mvvm.models.Article


class NewsAdapter: RecyclerView.Adapter<NewsAdapter.ArticleViewHolder>() {

    val articleImage= findViewById<ImageView>(R.id.ivArticleImage)

    inner class ArticleViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)

    private val differCallback= object:DiffUtil.ItemCallback<Article>(){
        override fun areItemsTheSame(oldItem: Article, newItem: Article): Boolean {
            return oldItem.url==newItem.url
        }

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

    val differ=AsyncListDiffer(this,differCallback)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
        return ArticleViewHolder(
            LayoutInflater.from(parent.context).inflate(
                R.layout.item_article_preview,
                parent,
                false
            )
        )
    }


    override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
        val article = differ.currentList[position]

        holder.itemView.apply {
            Glide.with(this).load(article.urlToImage).into(articleImage)
        }
    }

    override fun getItemCount(): Int {
        return differ.currentList.size
    }
}

如何解决这个错误?

你可以用它来解决这个错误,你已经在 holder 的外面定义了你的视图。您可以将其定义到 onbindholder 方法中,您可以将该图像视图用于您的适配器。

package com.example.newsapp_mvvm.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.example.newsapp_mvvm.R
import com.example.newsapp_mvvm.models.Article


class NewsAdapter: RecyclerView.Adapter<NewsAdapter.ArticleViewHolder>() {

    lateinit var articleImage:ImageView

    inner class ArticleViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)

    private val differCallback= object:DiffUtil.ItemCallback<Article>(){
        override fun areItemsTheSame(oldItem: Article, newItem: Article): Boolean {
            return oldItem.url==newItem.url
        }

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

    val differ=AsyncListDiffer(this,differCallback)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
        return ArticleViewHolder(
            LayoutInflater.from(parent.context).inflate(
                R.layout.item_article_preview,
                parent,
                false
            )
        )
    }


    override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
        val article = differ.currentList[position]

    articleImage= holder.itemView.findViewById<ImageView>(R.id.ivArticleImage)

        holder.itemView.apply {
            Glide.with(this).load(article.urlToImage).into(articleImage)
        }
    }

    override fun getItemCount(): Int {
        return differ.currentList.size
    }
}