RecyclerView 中的多个项目的底部 Sheet
Bottom Sheet for multiple items inside RecyclerView
我有一个看起来像 Twitter 的 posts 提要。该提要中的每个项目都有一个按钮,单击该按钮时应打开底部 sheet。提要使用 RecyclerView 布局和分页库。我的问题是如何为每个单独的项目动态实现底部 sheet,以便当用户单击按钮时显示一个菜单,提供报告该 post 用户的选项,复制post 的 link 等。我不确定如何为每个单独的项目动态创建底部 sheet 并为每个单独的底部提供动态数据 sheet.
实现此目标所需要做的事情非常简单
- 将带有参数的 lambda 函数传递给 RecyclerView 适配器的构造函数,该参数接受 RV 持有的数据项。
- 在
onBindViewHolder
中,您可以将 onClickListeners 设置为您的列表项视图
- 现在,无论您在何处初始化回收器视图,您都可以定义当用户通过 lambda 函数单击时必须执行的操作。
参考:
然后您可以将您需要的任何数据从 RV 检索到您的 activity/fragment,然后您可以使用它来显示您的底页
您需要为此创建一个 bottomsheet
,并且您可以传递每个 list
项目的数据,您希望在其上显示此 bottomsheet
.
让我们的Post
data class
看起来像这样
data class Post (
val userId: Int,
val link: String
)
创建一个接口,将 Post
数据从我们的 recyclerView
传递到我们的 fragment
。
interface ItemClickListener {
fun onItemClick(post: Post)
}
在 fragment
中实现此 interface
class TestFragment: Fragment(R.layout.test_fragment), ItemClickListener {
override onItemClick(post: Post) {
// will open bottomsheet from here
}
}
现在将 ItemClickListener
的引用传递给 recyclerView
的适配器,当用户单击该项目时,然后调用 listener
的 onItemClick
方法并传递点击视图的 Post
。您可以阅读有关它的更详细的答案
在 fragment
中收到 post
后,我们现在可以创建 bottomsheet
对话框并显示它
private fun showBottomSheetDialog(
post: Post
) {
val bottomSheetDialog = BottomSheetDialog(requireActivity())
val bottomSheetBinding = BottomSheetPostBinding.inflate(layoutInflater, binding.root, false)
bottomSheetBinding.apply {
tvShare.setOnClickListener {
sharePostLink(post.link) // share your post link from here
}
tvReport.setOnClickListener {
repostUser(post.userId) // report user
}
}
bottomSheetDialog.setContentView(bottomSheetBinding.root)
bottomSheetDialog.show()
}
从 overrided
onItemClick
方法内部调用此 showBottomSheetDialog
方法。
override onItemClick(post: Post) {
showBottomSheetDialog(post)
}
如果您要创建 BottomSheetDialogFragement
而不是 BottomSheetDialog
,您也可以这样做。
我有一个看起来像 Twitter 的 posts 提要。该提要中的每个项目都有一个按钮,单击该按钮时应打开底部 sheet。提要使用 RecyclerView 布局和分页库。我的问题是如何为每个单独的项目动态实现底部 sheet,以便当用户单击按钮时显示一个菜单,提供报告该 post 用户的选项,复制post 的 link 等。我不确定如何为每个单独的项目动态创建底部 sheet 并为每个单独的底部提供动态数据 sheet.
实现此目标所需要做的事情非常简单
- 将带有参数的 lambda 函数传递给 RecyclerView 适配器的构造函数,该参数接受 RV 持有的数据项。
- 在
onBindViewHolder
中,您可以将 onClickListeners 设置为您的列表项视图 - 现在,无论您在何处初始化回收器视图,您都可以定义当用户通过 lambda 函数单击时必须执行的操作。
参考:
然后您可以将您需要的任何数据从 RV 检索到您的 activity/fragment,然后您可以使用它来显示您的底页
您需要为此创建一个 bottomsheet
,并且您可以传递每个 list
项目的数据,您希望在其上显示此 bottomsheet
.
让我们的Post
data class
看起来像这样
data class Post (
val userId: Int,
val link: String
)
创建一个接口,将 Post
数据从我们的 recyclerView
传递到我们的 fragment
。
interface ItemClickListener {
fun onItemClick(post: Post)
}
在 fragment
interface
class TestFragment: Fragment(R.layout.test_fragment), ItemClickListener {
override onItemClick(post: Post) {
// will open bottomsheet from here
}
}
现在将 ItemClickListener
的引用传递给 recyclerView
的适配器,当用户单击该项目时,然后调用 listener
的 onItemClick
方法并传递点击视图的 Post
。您可以阅读有关它的更详细的答案
在 fragment
中收到 post
后,我们现在可以创建 bottomsheet
对话框并显示它
private fun showBottomSheetDialog(
post: Post
) {
val bottomSheetDialog = BottomSheetDialog(requireActivity())
val bottomSheetBinding = BottomSheetPostBinding.inflate(layoutInflater, binding.root, false)
bottomSheetBinding.apply {
tvShare.setOnClickListener {
sharePostLink(post.link) // share your post link from here
}
tvReport.setOnClickListener {
repostUser(post.userId) // report user
}
}
bottomSheetDialog.setContentView(bottomSheetBinding.root)
bottomSheetDialog.show()
}
从 overrided
onItemClick
方法内部调用此 showBottomSheetDialog
方法。
override onItemClick(post: Post) {
showBottomSheetDialog(post)
}
如果您要创建 BottomSheetDialogFragement
而不是 BottomSheetDialog
,您也可以这样做。