RecyclerView 中的多个项目的底部 Sheet

Bottom Sheet for multiple items inside RecyclerView

我有一个看起来像 Twitter 的 posts 提要。该提要中的每个项目都有一个按钮,单击该按钮时应打开底部 sheet。提要使用 RecyclerView 布局和分页库。我的问题是如何为每个单独的项目动态实现底部 sheet,以便当用户单击按钮时显示一个菜单,提供报告该 post 用户的选项,复制post 的 link 等。我不确定如何为每个单独的项目动态创建底部 sheet 并为每个单独的底部提供动态数据 sheet.

实现此目标所需要做的事情非常简单

  1. 将带有参数的 lambda 函数传递给 RecyclerView 适配器的构造函数,该参数接受 RV 持有的数据项。
  2. onBindViewHolder 中,您可以将 onClickListeners 设置为您的列表项视图
  3. 现在,无论您在何处初始化回收器视图,您都可以定义当用户通过 lambda 函数单击时必须执行的操作。

参考:

然后您可以将您需要的任何数据从 RV 检索到您的 activity/fragment,然后您可以使用它来显示您的底页

您需要为此创建一个 bottomsheet,并且您可以传递每个 list 项目的数据,您希望在其上显示此 bottomsheet .

让我们的Postdata 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 的适配器,当用户单击该项目时,然后调用 listeneronItemClick 方法并传递点击视图的 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,您也可以这样做。