RecyclerView Adapter 中的导航组件

Sal*_*ian 13 android kotlin android-recyclerview android-architecture-navigation

我在适配器中编写了以下代码。

holder.itemView.setOnClickListener {
    val action = SearchFragmentDirections.actionSearchFragmentToArtistFragment(artist.id)
    Navigation.createNavigateOnClickListener(action)
}
Run Code Online (Sandbox Code Playgroud)

这是可能的导航xml:

 ...
    <fragment android:id="@+id/searchFragment"
          android:name="com.salmanseifian.spotiny.ui.search.SearchFragment"
          android:label="SearchFragment">

    <action android:id="@+id/action_searchFragment_to_artistFragment"
            app:destination="@id/artistFragment"
            app:popUpTo="@+id/searchFragment"/>
</fragment>
Run Code Online (Sandbox Code Playgroud)

但它不会工作。有人可以帮忙吗?

Raj*_*shi 34

您正在使用 lambda,它本身就是一个点击侦听器。检查此导航文档,其中使用导航 id 和 createNavigationListener 正确实现了单击侦听器。

针对您的情况使用以下代码。

holder.itemView.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.action_searchFragment_to_artistFragment)
)
Run Code Online (Sandbox Code Playgroud)

或者,试试这种方式

holder.itemView.setOnClickListener{ view ->
 view.findNavController().navigate(R.id.action_searchFragment_to_artistFragment)
}
Run Code Online (Sandbox Code Playgroud)

  • 第二种选择对我来说很完美 (2认同)

A.s*_*del 6

我认为最好将此添加到已接受的答案中:

holder.itemView.setOnClickListener(
 Navigation
 .createNavigateOnClickListener(R.id.action_searchFragment_to_artistFragment).onClick(holder.itemView)
)
Run Code Online (Sandbox Code Playgroud)