0

我有一个由导航组件控制的活动,它有几个片段,在其中一个片段中有一个包含一些项目的 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 问题,但我不知道如何解决,感谢您的帮助和提前的时间

4

1 回答 1

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

}

我想这会有所帮助。

于 2021-10-13T17:29:51.277 回答