如何导航到回收站视图内的片段?
how to navigate to fragment inside recycler view?
我有一个 activity 由导航组件控制,它有几个片段,在这些片段之一中有一个 recyclerView 有一些项目,当我点击一个项目时我想要它将我导航到另一个包含有关该项目的附加信息的片段,我不知道如何在 recycelerView 中使用导航组件,当我键入 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)
问题是当我导航出这个片段或使用抽屉导航(其他片段的导航组件)时,我导航到的这个片段仍然显示在屏幕上,我同时看到两个片段,我假设它是一个 fragment backStack 问题,但我不知道如何解决它,感谢您的帮助和提前的时间
您不需要直接从 RecyclerView 项目导航到 AdditionalDetails 片段。
您可以在界面的帮助下做同样的事情。
步骤:
- 创建带有方法声明的接口。
- 从您使用 RecyclerView 的片段扩展接口并实现接口方法。
- 通过适配器传递此接口。
- 使用适配器的接口,您只需在单击项目时传递对象。
- 最后,您只需从您的片段导航到带参数的 AdditionalDetails 片段。
让我们看看我当前项目的示例代码:
- 界面
interface ChatListClickListener {
fun onChatListItemClick(view:View, user: User)
}
- 适配器Class
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
}
}
- 我的片段
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....
}
}
我想这会有所帮助。
我有一个 activity 由导航组件控制,它有几个片段,在这些片段之一中有一个 recyclerView 有一些项目,当我点击一个项目时我想要它将我导航到另一个包含有关该项目的附加信息的片段,我不知道如何在 recycelerView 中使用导航组件,当我键入 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)
问题是当我导航出这个片段或使用抽屉导航(其他片段的导航组件)时,我导航到的这个片段仍然显示在屏幕上,我同时看到两个片段,我假设它是一个 fragment backStack 问题,但我不知道如何解决它,感谢您的帮助和提前的时间
您不需要直接从 RecyclerView 项目导航到 AdditionalDetails 片段。 您可以在界面的帮助下做同样的事情。 步骤:
- 创建带有方法声明的接口。
- 从您使用 RecyclerView 的片段扩展接口并实现接口方法。
- 通过适配器传递此接口。
- 使用适配器的接口,您只需在单击项目时传递对象。
- 最后,您只需从您的片段导航到带参数的 AdditionalDetails 片段。
让我们看看我当前项目的示例代码:
- 界面
interface ChatListClickListener {
fun onChatListItemClick(view:View, user: User)
}
- 适配器Class
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
}
}
- 我的片段
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....
}
}
我想这会有所帮助。