我有一个提要片段,它的主要元素是帖子的回收器视图。
我正在管理丽莎·雷的群星图书馆的回收商https://github.com/lisawray/groupie
现在,在我的导航图中,我有一个将提要片段连接到另一个片段的操作,我尝试使用我在适配器的绑定函数中创建的单击侦听器调用此操作。
val action=FeedFragmentDirections.actionDestinationFeedToDestinationAddToBucket(image.id)
findNavController().navigate(action)
我不断收到一条错误消息,说navigation destination XXXXX is unknown to this NavController
我尝试在findNavController()
之前添加一些东西,例如viewHolder.itemView
或viewHolder.root
但没有任何效果。
当我使用viewHolder.itemView.rootView
时,我收到此错误View DecorView@a190adf[MainActivity] does not have a NavController set
因为我不知道DecorView是什么。
有什么想法可以正确实现我的 oncick 监听器吗?
使用 itemView 似乎也可以工作,因为这是我的代码:
class RecyclerSettingsItem(
private val activity: MainActivity,
private val settingItem: String
) : Item<GroupieViewHolder>() {
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
var navController: NavController? = null
viewHolder.apply {
with(viewHolder.itemView) {
tvTitle.text = settingItem
itemView.setOnClickListener {
navController = Navigation.findNavController(itemView)
navController!!.navigate(R.id.action_settingsFragment_to_contactTracingFragment)
}
}
}
}
override fun getLayout() = R.layout.rv_settings_item_row
}
只需在RecyclerView Adaptor类的承包商中传递导航控制器即可。爪哇示例
public RecyclerAdaptorMasseges(Context context, List<ConfirmationMessagesModuel> data, NavController navController) {
inflate = LayoutInflater.from(context);
this.data = data;
this.navController = navController;
Log.d("hex", " MsgRecyclerAdaptor");
}
RecylerView 适配器构造函数中传递父片段或活动。
class MyRecylerViewAdapter(...your other args.., val parentFragment: Fragment)
然后从父片段对象中找到导航控制器
parentFragment.findNavController()
编辑:您也可以直接通过navController
,但为什么要通过parentFragment
?如果您在应用程序中使用不同的主题,则视图和视图持有人的构造应使用parentFragment.requireActivity
Context
完成,否则您的主题将不会应用于RecyclerView
项。
itemBinding.tvProfileBooked.setOnClickListener {
val bundle = bundleOf("BookingId" to item.id)
Navigation.findNavController(it).navigate(R.id.profileBookedFragment,bundle)
}
现在配置文件片段
val bookingId = arguments?.getString("BookingId")
它对我有用
class MyRecylerViewAdapter(...your other args.., val findNavController: NavController)
MyRecylerViewAdapter(..., findNavController())
使用'requireView(('
requireView().findNavController().navigate(R.id.your_action)
我遇到了同样的问题,通过添加一个点击侦听器接口并在我的片段(或您的活动(中调用 navController 来解决它。
使用此示例:https://www.codexpedia.com/android/defining-item-click-listener-for-recyclerview-in-android/
我补充一下:
@Override
public void onClick(View view, int position) {
Globals.eventList = developersLists.get(position);
navController.navigate(R.id.eventoFragment);
}