【问题标题】:how to navigate to fragment inside recycler view?如何导航到回收站视图中的片段?
【发布时间】:2021-10-13 14:52:05
【问题描述】:

我有一个由导航组件控制的活动,它有几个片段,其中一个片段中有一个包含一些项目的 recyclerView,当我单击一个项目时,我希望它导航到另一个片段有关于该项目的其他信息,我不知道如何在 recyclerView 中使用导航组件,当我输入 findNavController 时,它有一些参数不确定要放入什么,或者它是否正确的功能,我也尝试过通过这样的代码:

val fm = (context as AppCompatActivity).supportFragmentManager
            fm.beginTransaction()
                .replace(R.id.fragmentContainer, fragment)
                .addToBackStack(null)
                .commit()

顺便说一句,这是要求其他参数的代码:

// it asks for a (fragment) or (activity, Int)
findNavController().navigate(R.id.action_settingsFragment_to_groupUnits)

问题是当我导航出这个片段或使用抽屉导航(其他片段的导航组件)时,我导航到的这个片段保持显示在屏幕上,我假设我同时看到两个片段这是一个片段 backStack 问题,但我不知道如何解决它,感谢您的帮助和您提前的时间

【问题讨论】:

    标签: kotlin android-fragments android-recyclerview


    【解决方案1】:

    您不需要直接从 RecyclerView 项目单击导航到 AdditionalDetails 片段。 您可以通过界面的帮助来做同样的事情。 步骤:

    1. 使用方法声明创建接口。
    2. 从您使用 RecyclerView 和实现接口方法的片段中扩展接口。
    3. 将此接口传递给适配器。
    4. 使用来自适配器的接口,您只需在单击项目时传递对象。
    5. 最后,您只需从片段导航到带参数的 AdditionalDetails 片段。

    让我们看看我当前项目的示例代码:

    1. 接口
    interface ChatListClickListener {
        fun onChatListItemClick(view:View, user: User)
    }
    
    1. 适配器类
    
    class UserAdapter(val Users: List<User>, val chatListClickListener: ChatListClickListener) : RecyclerView.Adapter<UserAdapter.UserViewHolder>()  {
    
        inner class UserViewHolder(
            val recyclerviewUsersBinding: RecyclerviewChatlistBinding
        ) : RecyclerView.ViewHolder(recyclerviewUsersBinding.root)
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
            val  vh = UserViewHolder(
                DataBindingUtil.inflate(
                    LayoutInflater.from(parent.context),
                    R.layout.recyclerview_chatlist,
                    parent,
                    false
                )
            )
            return vh
        }
    
        override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
            holder.recyclerviewUsersBinding.user = Users[position]
            holder.recyclerviewUsersBinding.root.setOnClickListener{
                chatListClickListener.onChatListItemClick(it,Users[position])
            }
        }
    
        override fun getItemCount(): Int {
            return Users.size
        }
    }
    
    1. 我的片段
    
    class FragmentChatList : Fragment(), ChatListClickListener {
    
        lateinit var binding: FragmentChatListBinding
        lateinit var viewModel: ChatListViewModel
        lateinit var listener: ChatListClickListener
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        }
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            val args: FragmentChatListArgs by navArgs()
            binding = FragmentChatListBinding.inflate(layoutInflater, container, false)
            val factory = ChatListFactory(args.user)
            viewModel = ViewModelProvider(this, factory).get(ChatListViewModel::class.java)
            binding.viewModel = viewModel
            listener = this
    
            lifecycleScope.launch {
                viewModel.addUserWhenUserConnect()
            }
            viewModel.userList.observe(viewLifecycleOwner, Observer { data ->
                binding.rvChatList.apply {
                    layoutManager = LinearLayoutManager(requireContext())
                    setHasFixedSize(true)
                    adapter = UserAdapter(data, listener)
                }
            })
            return binding.root
        }
    
        override fun onChatListItemClick(view: View, user: User) {
    
            Toast.makeText(requireContext(), user.name + "", Toast.LENGTH_SHORT).show()
    // here you navigate to your fragment....
        }
    
    }
    

    我想这会有所帮助。

    【讨论】:

    • 感谢您的帮助,我将阅读更多关于接口和其他我以前不知道的东西,以便我可以正确实现这些东西,当我取得进展时会更新您。跨度>
    • 嗨,非常感谢你,是的,你的方法工作,继续努力兄弟
    • 不客气,兄弟。也谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多