dazai
dazai

Reputation: 716

intent.putExtra: None of the following functions can be called with the arguments supplied

I'm trying to pass data from one activity to another through an intent with putExtra. The thing is, I get the error that says: None of the following functions can be called with the arguments supplied. I'm not sure why it's not working, since the variable that I'm referencing is in the viewholder. Any clue as to what's going on and how to fix it would help a lot.

This is my recycler adapter:

package com.example.newsapp

import android.content.Intent
import android.icu.text.CaseMap
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat.startActivity
import androidx.recyclerview.widget.RecyclerView
import com.example.newsapp.databinding.NewsItemBinding
import com.squareup.picasso.Picasso

class RecyclerAdapter (
   private var Titles: List<String>,
   private var Images: List<String>,
   private var Authors: List<String>,
   private var Descriptions: List<String>
       ) : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>(){

           inner class ViewHolder(
               view: View
           ): RecyclerView.ViewHolder(view){
               private val binding = NewsItemBinding.bind(view)

               val itemTitle: TextView = binding.tvTitle
               val itemImage: ImageView = binding.ivNewsImage

               fun bind(urlToImage:String){
                   Picasso.get().load(urlToImage).into(binding.ivNewsImage)
               }

               init {
                   itemImage.setOnClickListener{
                       val intent = Intent(view.context, PostActivity::class.java)
                       intent.putExtra("title",itemTitle)
                       view.context.startActivity(intent)
                   }
               }
           }

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

   override fun onBindViewHolder(holder: ViewHolder, position: Int) {
       holder.itemTitle.text = Titles[position]
       val itemImage = Images[position]
       holder.bind(itemImage)

   }

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

The part with the issue is this one:

init {
   itemImage.setOnClickListener{
   val intent = Intent(view.context, PostActivity::class.java)
   intent.putExtra("title",itemTitle)                                         view.context.startActivity(intent)
    }
}

This is my main activity:

package com.example.newsapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.newsapp.databinding.ActivityMainBinding
import kotlinx.coroutines.*
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.lang.Exception

class MainActivity : AppCompatActivity() {

   private lateinit var binding: ActivityMainBinding
   private lateinit var adapter: RecyclerAdapter

   private val newsTitles = mutableListOf<String>()
   private val newsImages = mutableListOf<String>()
   private val newsAuthors = mutableListOf<String>()
   private val newsDescriptions = mutableListOf<String>()

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       binding = ActivityMainBinding.inflate(layoutInflater)
       setContentView(binding.root)
       makeAPIRequest()
   }

   private fun initRecyclerView() {
       adapter = RecyclerAdapter( newsTitles, newsImages)
       binding.rvNews.layoutManager = LinearLayoutManager(this)
       binding.rvNews.adapter = adapter
   }


   private fun addToList(title:String, image:String, author:String, description:String){
       newsTitles.add(title)
       newsImages.add(image)
       newsAuthors.add(author)
       newsDescriptions.add(description)
   }

   private fun makeAPIRequest() {

       val api = Retrofit.Builder()
               .baseUrl("https://newsapi.org/")
               .addConverterFactory(GsonConverterFactory.create())
               .build()
               .create(APIService::class.java)

       GlobalScope.launch(Dispatchers.IO){
           val response = api.getNews()
           val posts = response.body()
           try{
               if (posts != null) {
                   for(art in posts.Articles){
                       Log.i("Main Activity", "Result = $art")
                       addToList(art.Title,art.urlToImage, art.Author, art.Description)
                   }
               }
                   withContext(Dispatchers.Main){
                       initRecyclerView()
                   }
               } catch (e:Exception){
                   Log.e("Main Activity", e.toString())
               }
       }
   }

}

Upvotes: 1

Views: 809

Answers (1)

CommonsWare
CommonsWare

Reputation: 1007474

intent.putExtra("title",itemTitle)

Here, itemTitle is a TextView. You cannot pass a TextView between activities. You could switch to:

intent.putExtra("title",itemTitle.text)

...to put the text from the TextView into the extra.

Also, you might want to consider whether these should be separate activities or just two fragments (or composables) in a single activity.

Upvotes: 1

Related Questions