我有一個由導航組件控制的活動,它有幾個片段,其中一個片段中有一個 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)
問題是當我導航出這個片段或使用抽屜導航(其他片段的導航組件)時,我導航到的這個片段保持顯示在螢屏上,我同時看到兩個片段,我假設它是一個片段backStack 問題,但我不知道如何解決它,感謝您的幫助和您提前的時間
uj5u.com熱心網友回復:
您不需要直接從 RecyclerView 項單擊導航到 AdditionalDetails 片段。您可以通過界面的幫助來做同樣的事情。腳步:
- 創建帶有方法宣告的介面。
- 從您使用 RecyclerView 和實作介面方法的片段擴展介面。
- 通過配接器傳遞這個介面。
- 使用配接器的介面,您只需在單擊專案時傳遞物件。
- 最后,從您的片段中,您只需導航到帶有引數的 AdditionalDetails 片段。
讓我們看看我當前專案中的示例代碼:
- 界面
interface ChatListClickListener {
fun onChatListItemClick(view:View, user: User)
}
- 配接器類
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....
}
}
我想這會有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325520.html
標籤:科特林 android-fragments android-recyclerview
上一篇:底部導航圖示不會改變
