0

I have two fragment. On one fragment I have recycler view . I have use retrofit to fetch news from api and set news on cardview on the recycler view. Now I want when user will click on a card the whole news will display on a new fragment. Here is the first fragment class where I have recycler view

package com.sumita.newsappusingfragment

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_recycle.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class Recycle : Fragment() {
    lateinit var adapter: NewsAdapter
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val view : View= inflater.inflate(R.layout.fragment_recycle, container, false)
        getNews()
        return view
    }
    private fun getNews() {
        val news : Call<News> = NewsSeversis.newsIntence.getHeadlines("in",1)
        //retrofit use a queue and store all the request on that queue and process one by one.when one
        // request processed it its callback and then process another
        news.enqueue(object : Callback<News> {
            override fun onResponse(call: Call<News>, response: Response<News>) {
                //here response is a News response
                val news:News?=response.body()
                if (news!=null){
                    Log.d("response",news.toString())
                    adapter= NewsAdapter(news.articles)
                    newsList.adapter=adapter
                    newsList.layoutManager= LinearLayoutManager(requireContext())
                }
            }
            override fun onFailure(call: Call<News>, t: Throwable) {
                Log.d("response","error occur",t)
            }
        })
    }
}

Here is the adapter of that recycler view

package com.sumita.newsappusingfragment

import android.content.Context
import android.content.Intent
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.item_layout.view.*

class NewsAdapter (val artical: List<Artical>):RecyclerView.Adapter<NewsAdapter.articalViewHolder>(){
   inner class articalViewHolder(itemView: View):RecyclerView.ViewHolder(itemView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): articalViewHolder {
        val view:View=LayoutInflater.from(parent.context).inflate(R.layout.item_layout,parent,false)
        return articalViewHolder(view)
    }

    override fun onBindViewHolder(holder: articalViewHolder, position: Int) {
        val articals:Artical=artical[position]
        holder.itemView.apply {
            newsTitle.text=articals.title
            newsDescription.text=articals.description
            Glide.with(context).load(articals.urlToImage).into(newsImage)
            holder.itemView.setOnClickListener {

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

Now I want to pass the url of that news on Item clicked. How I can implement that onClickListener

gioravered
  • 1,758
  • 3
  • 19
  • 30
Sumita Das
  • 45
  • 6

1 Answers1

0

While the answer below can work, it is considered a better practice to use Android's built-in ViewModel. A ViewModel can be shared between Fragments: https://developer.android.com/guide/fragments/communicate.

If you still want to stick with your code, I would:

  1. Add a click listener to your adapter:
class NewsAdapter (
    val artical: List<Artical>,
    private val onArticleClick: (article: Artical) -> Unit) : RecyclerView.Adapter<NewsAdapter.articalViewHolder>(){
    onArticleClick(
}
  1. Call it when the user clicks the article:
holder.itemView.setOnClickListener {
    onArticleClick(articals)
}
  1. In your Recycle Fragment, pass a click listener to your Adapter:
adapter = NewsAdapter(news.articles) { article -> 
    //Handle article click here
}
  1. When handling the click, create your new Fragment and use the bundle attributes to pass the article data:

Again it is encouraged to remove any business logic from the view classes (Fragments, Activities...) and use a better architecture for your application

gioravered
  • 1,758
  • 3
  • 19
  • 30