E/RecyclerView: No adapter attached; skipping layout for Recycler View in Kotlin Android Project Code Answer

Hello Developer, Hope you guys are doing great. Today at Tutorial Guruji Official website, we are sharing the answer of E/RecyclerView: No adapter attached; skipping layout for Recycler View in Kotlin Android Project without wasting too much if your time.

The question is published on by Tutorial Guruji team.

I am following this tutorial to create image gallery in an android project. I am trying to show the gallery in a fragment using a ReycyclerView with a grid layout. The fragment is linked to a bottom navigation bar, but the gallery isn’t showing anything when the fragment is displayed. Log says: E/RecyclerView: No adapter attached; skipping layout even though I instantiated an adapter and passed it to my recycler view.

ImpressionsFragment.kt

class ImpressionsFragment : Fragment(), GalleryImageClickListener  {

    // gallery column count
    private val SPAN_COUNT = 3
    private val imageList = ArrayList<Image>()
    lateinit var galleryAdapter : GalleryImageAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        // init adapter
        galleryAdapter = GalleryImageAdapter(imageList)
        galleryAdapter.listener = this
        // init recyclerview
        var view = inflater?.inflate(R.layout.fragment_impressions, container, false)
        var recyclerView : RecyclerView = view.findViewById(R.id.recyclerView)
        recyclerView.layoutManager = GridLayoutManager(context, SPAN_COUNT)
        recyclerView.adapter = galleryAdapter
        // load images
        loadImages()
        return inflater.inflate(R.layout.fragment_impressions, container, false)
    }

    private fun loadImages() {
        imageList.add(Image("https://i.ibb.co/wBYDxLq/beach.jpg", "Beach Houses"))
        imageList.add(Image("https://i.ibb.co/gM5NNJX/butterfly.jpg", "Butterfly"))
        imageList.add(Image("https://i.ibb.co/10fFGkZ/car-race.jpg", "Car Racing"))
        imageList.add(Image("https://i.ibb.co/ygqHsHV/coffee-milk.jpg", "Coffee with Milk"))
        imageList.add(Image("https://i.ibb.co/7XqwsLw/fox.jpg", "Fox"))
        imageList.add(Image("https://i.ibb.co/L1m1NxP/girl.jpg", "Mountain Girl"))
        imageList.add(Image("https://i.ibb.co/wc9rSgw/desserts.jpg", "Desserts Table"))
        imageList.add(Image("https://i.ibb.co/wdrdpKC/kitten.jpg", "Kitten"))
        imageList.add(Image("https://i.ibb.co/dBCHzXQ/paris.jpg", "Paris Eiffel"))
        imageList.add(Image("https://i.ibb.co/JKB0KPk/pizza.jpg", "Pizza Time"))
        imageList.add(Image("https://i.ibb.co/VYYPZGk/salmon.jpg", "Salmon "))
        imageList.add(Image("https://i.ibb.co/JvWpzYC/sunset.jpg", "Sunset in Beach"))
        galleryAdapter.notifyDataSetChanged()
    }

    override fun onClick(position: Int) {
        // handle click of image
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         * @return A new instance of fragment ImpressionsFragment.
         */
        fun newInstance() =
            ImpressionsFragment().apply {
            }
    }
}

GalleryImageAdapter

class GalleryImageAdapter(private val itemList: List<Image>) : RecyclerView.Adapter<GalleryImageAdapter.ViewHolder>() {
    private var context: Context? = null
    var listener: GalleryImageClickListener? = null
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GalleryImageAdapter.ViewHolder {
        context = parent.context
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_gallery_image, parent,
            false)
        return ViewHolder(view)
    }
    override fun getItemCount(): Int {
        return itemList.size
    }
    override fun onBindViewHolder(holder: GalleryImageAdapter.ViewHolder, position: Int) {
        holder.bind()
    }
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind() {
            val image = itemList.get(adapterPosition)
            // load image
            GlideApp.with(context!!)
                .load(image.imageUrl)
                .centerCrop()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(itemView.ivGalleryImage)
            // adding click or tap handler for our image layout
            itemView.container.setOnClickListener {
                listener?.onClick(adapterPosition)
            }
        }
    }
}

Thank you in advance!

Answer

The view used in creating the recycler view is not same as the view returned You created a view and that was used to initialize the recycler view,

  var view = inflater?.inflate(R.layout.fragment_impressions, container, false)

instead of returning this same view above you created another view and returned it.

 return inflater.inflate(R.layout.fragment_impressions, container, false)

so the view used in initializing the recycler view is invalid and the recycler view, therefore invalid also.

We are here to answer your question about E/RecyclerView: No adapter attached; skipping layout for Recycler View in Kotlin Android Project - If you find the proper solution, please don't forgot to share this with your team members.

Related Posts

Tutorial Guruji