如何将导航组件与来自RecyclerView元素的点击一起使用?

时间:2019-03-26 22:23:08

标签: android-recyclerview navigation android-architecture-navigation

我有一个提要片段,其主要元素是帖子的RecyclerView。

我正在使用Lisa Wray的Groupie库管理回收站 https://github.com/lisawray/groupie

现在在导航图中,我有一个将提要片段连接到另一个片段的动作,我尝试使用在适配器的绑定函数中创建的on click监听器调用此动作。

val action=FeedFragmentDirections.actionDestinationFeedToDestinationAddToBucket(image.id)
findNavController().navigate(action)

我不断收到错误消息,说navigation destination XXXXX is unknown to this NavController

我尝试在findNavController()之前添加一些内容,例如viewHolder.itemViewviewHolder.root,但没有任何效果。

当我使用viewHolder.itemView.rootView时出现此错误,而不是View DecorView@a190adf[MainActivity] does not have a NavController set我不知道DecorView是什么。

有什么想法可以正确实现我的oncick侦听器吗?

5 个答案:

答案 0 :(得分:3)

使用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

}

答案 1 :(得分:0)

您可以在recylerview适配器构造函数中传递父片段或活动。

class MyRecylerViewAdapter(...your other args.., val parentFragment: Fragment)

然后从您的parentFragment对象中找到navController

parentFragment.findNavController()

答案 2 :(得分:0)

对我有用

  // Use the function `run` directly in case the object from `useFetch` has changed (e.g when data change)
  const { run } = useFetch(); 

  useEffect(() => {
    run("/api/user");
  }, [run]);
<ng-template #rt let-r="result" let-t="term">
    <li style="color:green">{{r.categoryName}}</li>
    <li *ngFor="let item of r['subCategoriesList']">
        {{item}}
    </li> 
    <ng-container *ngTemplateOutlet="rt; context: {result:r.repeatTemplate, term: 'kl'}">
    </ng-container>
</ng-template>

答案 3 :(得分:0)

只需通过recyclerview适配器类的承包商中的导航控制器即可。 Java示例

public RecyclerAdaptorMasseges(Context context, List<ConfirmationMessagesModuel> data, NavController navController) {
    inflate = LayoutInflater.from(context);
    this.data = data;
    this.navController = navController;
    Log.d("hex", " MsgRecyclerAdaptor");

}

答案 4 :(得分:0)

您可以使用'requireView()'

     requireView().findNavController().navigate(R.id.your_action)