Для функции Navigation.findNavController()
нужен код Activity
в коде A, но я могу получить context
только через itemView.context
.
Как мне получить Activity
из RecyclerView.ViewHolder(itemView)
вAndroid Studio?
В настоящее время я должен передать private val mActivity: Activity
из кода B в код A, это работает, но я думаю, что это не очень хороший способ.
Добавленный контент:
Мириане Итани: Спасибо!
Ваш код работает хорошо. Я вставляю XML-файл FrameLayout, вы можете увидеть код C
Мне очень странно, как код Navigation.findNavController(temView)...
находит элемент управления NavController? Не могли бы вы сказать мне ?
Вы знаете, что легко понять код Navigation.findNavController(mActivity, R.id.fragment_container)
, потому что идентификатор NavController равен fragment_container
, и он уникален.
код A
class VideoListAdapter (private val videoList: List<File>, private val mActivity: Activity) : RecyclerView.Adapter<VideoListAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideoListAdapter.MyViewHolder {
val v = LayoutInflater.from(parent.context).inflate(R.layout.layout_fragment_video_list_recycleview, parent, false)
return MyViewHolder(v)
}
override fun onBindViewHolder(holder: VideoListAdapter.MyViewHolder, position: Int) {
holder.bindItems(videoList[position])
}
override fun getItemCount(): Int {
return videoList.size
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindItems(aFile: File) {
itemView.tvVideoFileName.text=aFile.name
itemView.btnPlay.setOnClickListener {
Navigation.findNavController(mActivity, R.id.fragment_container).navigate(
UIFragmentVideoListDirections.aVideoList2Video((aFile.absolutePath)) )
}
}
}
}
код B
class UIFragmentVideoList : Fragment() {
private lateinit var listFile: MutableList<File>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.layout_fragment_video_list, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val outputDirectoryOfVideo = getVideoOutputDirectory(requireContext())
listFile =outputDirectoryOfVideo.listFiles{file -> VIDEO_EXTENSION_WHITELIST.contains(file.extension.toUpperCase())}
.sorted().reversed().toMutableList()
videoRecyclerView.layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
val aVideoListAdapter=VideoListAdapter(listFile,requireActivity())
videoRecyclerView.adapter=aVideoListAdapter
}
}
код C
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fragment
android:id="@+id/fragment_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</FrameLayout>