Home > Mobile >  Can't pass data from recyclerview adapter to another kotlin fragment
Can't pass data from recyclerview adapter to another kotlin fragment

Time:09-01

I'm trying to move from activities to fragments

In old activity app when the user clicks on the item he is going to a new activity with item data

Now i need same thing in fragment

Here's my adapter code

    override fun onBindViewHolder(holder: PhotosHolder, position: Int) {
        val productPhoto = photosArrayList[position]
        val key = productPhoto.key
        val name = productPhoto.name
        val price = productPhoto.price
        val photo = productPhoto.photo
        val photo2 = productPhoto.photo2
        val photo3 = productPhoto.photo3
        val link = "http://suleimanmf.com/Photos/"

        holder.key.text = key
        holder.name.text = name
        holder.price.text = price
        holder.photo = photo
        holder.photo2 = photo2
        holder.photo3 = photo3
        holder.container.setOnClickListener {
            goToProductInfo(productPhoto)
        }
    }

    private fun goToProductInfo(info: Photo) {

        val photosFragment = PhotosFragment()
        val bundle = Bundle()

        bundle.putString("key", info.key)
        bundle.putString("name", info.name)
        bundle.putString("price", info.price)
        bundle.putString("photo", info.photo)
        bundle.putString("photo2", info.photo2)
        bundle.putString("photo3", info.photo3)

        photosFragment.arguments = bundle

        (context.applicationContext as MainActivity).supportFragmentManager.beginTransaction()
            .apply {
                replace(R.id.nav_host_fragment_content_main, photosFragment).addToBackStack(null)
                commit()
            }
        // Old activity
        /**
        val intent = Intent(context, ProductInfoActivity::class.java)
        intent.putExtra("key", info.key)
        intent.putExtra("name", info.name)
        intent.putExtra("price", info.price)
        intent.putExtra("photo", info.photo)
        intent.putExtra("photo2", info.photo2)
        intent.putExtra("photo3", info.photo3)
        startActivity(context, intent, null)
        */
    }
}

When I click on the item I get this error

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.suleimanmf.gazarcustomers, PID: 5389
    java.lang.ClassCastException: android.app.Application cannot be cast to androidx.appcompat.app.AppCompatActivity
        at com.suleimanmf.gazarcustomers.ui.gallery.adapter.PhotosAdapter.goToProductInfo(PhotosAdapter.kt:97)
        at com.suleimanmf.gazarcustomers.ui.gallery.adapter.PhotosAdapter.onBindViewHolder$lambda-0(PhotosAdapter.kt:80)

Sorry for my poor English

Thanks in advance

CodePudding user response:

The main problem is that you are getting the application context and casting it to MainActivity which is not possible because as the name declares it's application context only. Actually when you want to work with fragments, the only component which is rrsponsible to hold the fragments inside, is the activity instance. So, the only thing you need to do is replacing the below code lines:

(context.applicationContext as MainActivity).supportFragmentManager.beginTransaction()
        .apply {
            replace(R.id.nav_host_fragment_content_main, photosFragment).addToBackStack(null)
            commit()
        }

With the below lines of code:

(context as MainActivity).supportFragmentManager.beginTransaction()
        .apply {
            replace(R.id.nav_host_fragment_content_main, photosFragment).addToBackStack(null)
            commit()
        }

Then your code will work properly.

  • Related