'Why my click listener cannot be functioned?

I have faced the problem of my click listener function cannot being used in my recyclerview. Before putting these click listener codes on the fragment page, they can normally use on the activity page. However, after put inside the fragment, it shows wrongly for me. Can somebody help me? Thank you for your help!!

The main fragment ( Notification_Fragment ) called out all function :

package com.example.assignment_mad

import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.example.assignment_mad.databinding.ActivityMainBinding
import com.google.android.material.imageview.ShapeableImageView
import com.google.android.material.tabs.TabLayout
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_notification_.*


class Notification_Fragment : Fragment( ) {

    private lateinit var newRecyclerView: RecyclerView
    private lateinit var newArrayList: ArrayList<Company>
    private lateinit var tempArrayList: ArrayList<Company>
    lateinit var imageId:Array<Int>
    lateinit var heading:Array<String>
    lateinit var news:Array<String>



    private var layoutManager: RecyclerView.LayoutManager? = null
    private var adapter: RecyclerView.Adapter<NotificationAdapter.MyViewHolder>? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        var views =inflater.inflate(R.layout.fragment_notification_, container, false)
        newRecyclerView=views.findViewById(R.id.recyclerView)

        // Inflate the layout for this fragment
        return views


    }

    override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {

        imageId= arrayOf(
            R.drawable.company_logo_1,
            R.drawable.company_logo_2,
            R.drawable.company_logo_3,
            R.drawable.company_logo_4,
            R.drawable.company_logo_5,
            R.drawable.company_logo_6,
            R.drawable.company_logo_7,
            R.drawable.company_logo_8,
            R.drawable.company_logo_9,
            R.drawable.company_logo_10
        )

        heading= arrayOf(
            "Candidate Biden Called Saudi Arable a Pareft eaft.",
            "The definitive text on the healing powers of the mind/body connection.",
            "This is the definitive book on mindfulness from the beloved Zen master.",
            "A timeless classic in personal development.",
            "The definitive text on the healing powers of the mind/body connection.",
            "The definitive text on the healing powers of the mind/body connection.",
            "The definitive text on the healing powers of the mind/body connection.",
            "The definitive text on the healing powers of the mind/body connection.",
            "The definitive text on the healing powers of the mind/body connection.",
            "The definitive text on the healing powers of the mind/body connection."
        )

        news= arrayOf(
            getString(R.string.news_a),
            getString(R.string.news_b),
            getString(R.string.news_c),
            getString(R.string.news_d),
            getString(R.string.news_e),
            getString(R.string.news_f),
            getString(R.string.news_g),
            getString(R.string.news_h),
            getString(R.string.news_i),
            getString(R.string.news_j)
        )




        newArrayList= arrayListOf<Company>()
        tempArrayList= arrayListOf<Company>()
        getUserdata()

        super.onViewCreated(itemView, savedInstanceState)

        newRecyclerView.apply {
            layoutManager=LinearLayoutManager(activity)
            newRecyclerView.setHasFixedSize(true)

        }


        recyclerView.apply {
            // set a LinearLayoutManager to handle Android
            // RecyclerView behavior
            layoutManager = LinearLayoutManager(activity)
            // set the custom adapter to the RecyclerView
            adapter = NotificationAdapter(newArrayList)
        }



    }


    private fun getUserdata() {
        for (i in imageId.indices){
            val company=Company(imageId[i],heading[i])
            newArrayList.add(company)
        }

//        tempArrayList.addAll(newArrayList)
//
//        val adapter = Notification_Fragment(tempArrayList)

        var adapter=NotificationAdapter(newArrayList)
        newRecyclerView.adapter=adapter
        adapter.setOnItemClickListener(object :NotificationAdapter.onItemClickListener{
            override fun onItemClick(position: Int) {
                Toast.makeText(context,"You clicked in item no . $position",Toast.LENGTH_SHORT).show()

                val intent= Intent(context,Notification_Detail::class.java)
                intent.putExtra("name",newArrayList[position].heading)
                intent.putExtra("imageId",newArrayList[position].titleImage)
                intent.putExtra("news",news[position])
                startActivity(intent)
            }
        })
    }


}

The code for using create recyclerview and clicklistener ( Notification_Adapter ) :

package com.example.assignment_mad

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.imageview.ShapeableImageView



class NotificationAdapter(private val companysList:ArrayList<Company>):RecyclerView.Adapter<NotificationAdapter.MyViewHolder>() {



    private var mListener:onItemClickListener?=null

    interface onItemClickListener{
        fun onItemClick(position: Int)
    }

    fun setOnItemClickListener(listener: onItemClickListener){
        mListener=listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

        val itemView=LayoutInflater.from(parent.context).inflate(R.layout.list_item,parent,false)
        return MyViewHolder(itemView,mListener)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem=companysList[position]
        holder.titleImage.setImageResource(currentItem.titleImage)
        holder.tvHeading.text=currentItem.heading
    }

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

    //to insert the post detail


    class MyViewHolder(itemView: View,listener: onItemClickListener?):RecyclerView.ViewHolder(itemView){

        val titleImage:ShapeableImageView=itemView.findViewById(R.id.title_image)
        val tvHeading: TextView =itemView.findViewById(R.id.tvHeading)

        init {
            itemView.setOnClickListener{
                listener?.onItemClick(adapterPosition)
            }
        }
    }

}

The intent page for using after click one of the recycler view ( Notification_Detail ) :

package com.example.assignment_mad

import android.os.Bundle
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class Notification_Detail:AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.notification_detail)

        val headingNews: TextView =findViewById(R.id.heading)
        val mainNews: TextView =findViewById(R.id.news)
        val imageNews: ImageView =findViewById(R.id.image_heading)

        val bundle: Bundle?=intent.extras
        val heading=bundle!!.getString("heading")
        val imageId=bundle.getInt("imageId")
        val news=bundle.getString("news")

        headingNews.text=heading
        mainNews.text=news
        imageNews.setImageResource(imageId)

    }

}


Solution 1:[1]

The problem is that you are resetting your recycler view adapter to a new one after the getUserdata function has been called the first time. Try to change your recycler view initialization like this:

class Notification_Fragment : Fragment( ) {

    private lateinit var newRecyclerView: RecyclerView
    private lateinit var newArrayList: ArrayList<Company>
    private lateinit var tempArrayList: ArrayList<Company>
    lateinit var imageId:Array<Int>
    lateinit var heading:Array<String>
    lateinit var news:Array<String>

    private var layoutManager: RecyclerView.LayoutManager? = null
    private var adapter: RecyclerView.Adapter<NotificationAdapter.MyViewHolder>? = null

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        var views =inflater.inflate(R.layout.fragment_notification_, container, false)
        newRecyclerView=views.findViewById(R.id.recyclerView)
        // Inflate the layout for this fragment
        return views
    }

    override fun onViewCreated(itemView: View, savedInstanceState: Bundle?) {
        super.onViewCreated(itemView, savedInstanceState)

        // ...

        newArrayList= arrayListOf<Company>()
        tempArrayList= arrayListOf<Company>()
        
        getUserdata()
    }


    private fun getUserdata() {
        for (i in imageId.indices){
            val company=Company(imageId[i],heading[i])
            newArrayList.add(company)
        }

//        tempArrayList.addAll(newArrayList)
//
//        val adapter = Notification_Fragment(tempArrayList)

        var adapter=NotificationAdapter(newArrayList)
        adapter.setOnItemClickListener(object : NotificationAdapter.onItemClickListener{
            override fun onItemClick(position: Int) {
                Toast.makeText(context,"You clicked in item no . $position",Toast.LENGTH_SHORT).show()

                val intent= Intent(context,Notification_Detail::class.java)
                intent.putExtra("name",newArrayList[position].heading)
                intent.putExtra("imageId",newArrayList[position].titleImage)
                intent.putExtra("news",news[position])
                startActivity(intent)
            }
        })

        newRecyclerView.layoutManager=LinearLayoutManager(activity)
        newRecyclerView.setHasFixedSize(true)
        newRecyclerView.adapter=adapter
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 lpizzinidev