You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:27:21