如何在Fragment间传递数据?实现RecyclerView点击传新闻URL
实现点击卡片传递URL到新Fragment的步骤
1. 给NewsAdapter添加点击回调接口
修改NewsAdapter类,定义点击回调接口,让Adapter将点击事件传递给宿主Fragment:
package com.sumita.newsappusingfragment import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.item_layout.view.* // 定义点击回调接口 interface OnArticleClickListener { fun onArticleClick(newsUrl: String) } class NewsAdapter( val artical: List<Artical>, private val listener: OnArticleClickListener // 添加接口参数 ): 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) // 给Item设置点击事件,触发回调 holder.itemView.setOnClickListener { listener.onArticleClick(articals.url) } } } override fun getItemCount(): Int { return artical.size } }
2. 修改Recycle Fragment实现回调接口并处理跳转
让Recycle Fragment实现刚才定义的OnArticleClickListener接口,在回调方法中完成Fragment跳转并传递URL:
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(), NewsAdapter.OnArticleClickListener { 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) news.enqueue(object : Callback<News> { override fun onResponse(call: Call<News>, response: Response<News>) { val news:News?=response.body() if (news!=null){ Log.d("response",news.toString()) // 初始化Adapter时传入当前Fragment(回调接口实现类) adapter= NewsAdapter(news.articles, this@Recycle) newsList.adapter=adapter newsList.layoutManager= LinearLayoutManager(requireContext()) } } override fun onFailure(call: Call<News>, t: Throwable) { Log.d("response","error occur",t) } }) } // 实现回调方法,处理跳转逻辑 override fun onArticleClick(newsUrl: String) { // 创建目标Fragment(替换成你的新Fragment类名) val detailFragment = NewsDetailFragment() // 用Bundle传递URL val bundle = Bundle().apply { putString("NEWS_URL", newsUrl) } detailFragment.arguments = bundle // 执行Fragment跳转(替换容器布局,需替换成你的布局容器id) parentFragmentManager.beginTransaction() .replace(R.id.fragment_container, detailFragment) .addToBackStack(null) // 可选:添加到返回栈,支持返回上一页 .commit() } }
3. 在目标Fragment中接收URL
在你的新Fragment(示例中为NewsDetailFragment)中,通过arguments获取传递的URL:
class NewsDetailFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_news_detail, container, false) // 获取传递的URL val newsUrl = arguments?.getString("NEWS_URL") // 此处可使用URL执行后续操作,比如加载网页等 return view } }
关键说明:
- 采用接口回调的方式让Adapter和Fragment解耦,避免Adapter直接依赖Fragment或Context处理跳转,符合Android组件设计规范。
- 使用
Bundle传递数据是Fragment间传参的标准方式,能确保数据在配置变更(如屏幕旋转)时不丢失。 parentFragmentManager用于在Fragment中管理其他Fragment的事务,若你的布局结构嵌套较深,也可根据需求使用childFragmentManager。
内容的提问来源于stack exchange,提问作者Sumita Das
相关产品推荐
相关产品推荐

