Android Fragments 如何在片段之间传递数据

8mmmxcuj  于 2023-05-23  发布在  Android
关注(0)|答案(1)|浏览(121)

我有两个片段。在一个片段上,我有回收器视图。我使用reflect从API获取新闻,并在cardview的recycler视图上设置新闻。现在,我想当用户将点击一张卡片,整个新闻将显示在一个新的片段。这里是第一个片段类,我有回收器视图

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)
            }
        })
    }
}

下面是该回收器视图的适配器

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
    }
}

现在我想把那个新闻的url传递到点击的项目上。如何实现onClickListener

iih3973s

iih3973s1#

虽然下面的答案可以工作,但使用Android的内置ViewModel被认为是更好的做法。ViewModel可以在Fragments之间共享:https://developer.android.com/guide/fragments/communicate
如果你仍然想坚持你的代码,我会:
1.为适配器添加click监听器

class NewsAdapter (
    val artical: List<Artical>,
    private val onArticleClick: (article: Artical) -> Unit) : RecyclerView.Adapter<NewsAdapter.articalViewHolder>(){
    onArticleClick(
}

1.当用户点击文章时调用它:

holder.itemView.setOnClickListener {
    onArticleClick(articals)
}

1.在您的Recycle Fragment中,向Adapter传递一个click listener:

adapter = NewsAdapter(news.articles) { article -> 
    //Handle article click here
}

1.处理单击时,create your new Fragment and use the bundle attributes to pass the article data

再次建议从视图类(Fragments、Activities...)中删除任何业务逻辑,并使用better architecture for your application

相关问题