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

点击CardView后如何通过NavController跳转至指定Fragment?

解决RecyclerView中CardView点击跳转对应Fragment的问题(Navigation Graph实现)

问题根源分析

当前代码未给CardView设置点击事件监听,也没有建立点击事件与NavController导航的关联逻辑,导致点击无响应。以下是分步修改方案:


1. 扩展数据类,绑定跳转目标

修改FlashCardInfo,新增字段存储对应Fragment在Navigation Graph中的ID,实现数据与跳转目标的绑定:

data class FlashCardInfo(
    val imageId: Int,
    val name: String,
    val translation: String,
    val destinationId: Int // 新增:对应Navigation Graph中目标Fragment的ID
)

2. 修改Adapter,添加点击回调

重构FlashcardsAdapter,通过Lambda回调传递点击事件,避免Adapter持有Context或NavController:

class FlashcardsAdapter(
    private val imageList: List<FlashCardInfo>,
    private val onItemClick: (FlashCardInfo) -> Unit // 点击事件回调
) : RecyclerView.Adapter<FlashcardsAdapter.ViewHolder>() {

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val imageViewFlashcards = itemView.findViewById<ImageView>(com.example.visuallithuanian.R.id.imageViewFlashcards)
        val textViewFlashcards = itemView.findViewById<TextView>(com.example.visuallithuanian.R.id.textflashCardName)
        val textViewFlashcardsLithuanian = itemView.findViewById<TextView>(com.example.visuallithuanian.R.id.textflashCardLithuanian)
        val cardView = itemView.findViewById<CardView>(com.example.visuallithuanian.R.id.cardFlashCards) // 直接在ViewHolder中缓存CardView
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(com.example.visuallithuanian.R.layout.item_flashcards, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val currentItem = imageList[position]

        holder.imageViewFlashcards.setImageResource(currentItem.imageId)
        holder.textViewFlashcards.text = currentItem.name
        holder.textViewFlashcardsLithuanian.text = currentItem.translation

        // 给CardView设置点击事件,触发回调
        holder.cardView.setOnClickListener {
            onItemClick(currentItem)
        }
    }

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

3. 更新Fragment,处理点击导航

在FlashCards Fragment中,初始化Adapter时传入点击回调,利用NavController完成页面跳转:

class FlashCards : Fragment() {

    lateinit var bottomNav:BottomNavigationView

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view=inflater.inflate(R.layout.fragment_flash_cards, container, false)

        bottomNav = (activity as? FirstScreen)?.findViewById(R.id.bottomNavigationView)!!
        bottomNav.visibility = View.VISIBLE

        val back_icon = view.findViewById<ImageView>(R.id.back_icon)
        val recyclerViewCards1 = view.findViewById<RecyclerView>(R.id.recyclerViewFlashcards)

        recyclerViewCards1.layoutManager = LinearLayoutManager(context)
        val navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment)

        val flashCardList = generateFlashCards()
        // 初始化Adapter并设置点击回调
        val adapter = FlashcardsAdapter(flashCardList) { flashCardInfo ->
            navController.navigate(flashCardInfo.destinationId)
        }
        recyclerViewCards1.adapter = adapter

        back_icon.setOnClickListener {
            activity?.onBackPressed()
        }

        return view
    }

    // 更新数据生成逻辑,添加对应Fragment的ID
    private fun generateFlashCards():List<FlashCardInfo> {
        return listOf(
            FlashCardInfo(R.drawable.talking,"Daily Conversation","Kasdienis pokalbis", R.id.dailyConversationFragment),
            FlashCardInfo(R.drawable.doctorvisit,"Questions and Pronouns","Klausimai ir įvardžiai", R.id.questionsPronounsFragment),
            FlashCardInfo(R.drawable.food,"Food","Maistas", R.id.foodFragment),
            FlashCardInfo(R.drawable.relatives,"Relatives","Giminaičiai", R.id.relativesFragment),
            FlashCardInfo(R.drawable.clothing,"Clothing","Drabužiai", R.id.clothingFragment),
            FlashCardInfo(R.drawable.village,"Towns and Villages","Miestai ir kaimai", R.id.townsVillageFragment),
            FlashCardInfo(R.drawable.nature,"Nature","Gamta", R.id.natureFragment),
            FlashCardInfo(R.drawable.verbs,"Popular Verbs","Populiariausi veiksmažodžiai", R.id.popularVerbsFragment),
        )
    }
}

4. 配置Navigation Graph

确保res/navigation/nav_graph.xml中已添加所有目标Fragment,并设置正确的ID(需与上述代码中的destinationId一致):

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/flashCardsFragment">

    <fragment
        android:id="@+id/flashCardsFragment"
        android:name="com.example.visuallithuanian.FlashCards"
        android:label="FlashCards" />

    <!-- 示例目标Fragment,需替换为实际类路径 -->
    <fragment
        android:id="@+id/dailyConversationFragment"
        android:name="com.example.visuallithuanian.DailyConversationFragment"
        android:label="Daily Conversation" />

    <fragment
        android:id="@+id/questionsPronounsFragment"
        android:name="com.example.visuallithuanian.QuestionsPronounsFragment"
        android:label="Questions and Pronouns" />

    <!-- 其他目标Fragment依次添加 -->
</navigation>

内容的提问来源于stack exchange,提问作者PurpleRabbit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:37:00