android - 如何从 RecyclerView 读取数据并发送到 BottomSheet
问题描述
我正在使用 recyclerView 显示设备中安装的应用程序列表
图片 -链接
有关更多详细信息,我在 LongPress 上使用 bottomSheet,即在 ViewHolder 类中,但如何将所选选项卡的数据发送到 bottomSheet并提供更多详细信息(例如包名称、API 级别等)...供参考,请参阅图片
我要 -链接
我从下面的编码中得到 -链接
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView.adapter = Adapter // I set adapter here with function getApps()
recyclerView.layoutManager = LinearLayoutManager(this)
private fun getApps(): List<DataClass> {
// here I get apps icon,name,size and return list<DataClass>
return list
}
适配器.kt
class Adapter(private val listOfApps: List<AppData>) :
RecyclerView.Adapter<Adapter.ViewHolder>() {
class ViewHolder(appView: View) : RecyclerView.ViewHolder(appView), View.OnClickListener,
View.OnLongClickListener {
init {
appView.setOnClickListener(this)
appView.setOnLongClickListener(this)
}
val icon: ImageView = appView.App_icon
val name: TextView = appView.App_name
val size: TextView = appView.App_size
override fun onClick(v: View?) {
Toast.makeText(v?.context, "OnClick", Toast.LENGTH_SHORT).show()
}
override fun onLongClick(v: View?): Boolean {
// I want here on Long press BottomSheet appears with details
val bottomSheetDialog = BottomSheetDialog()
// Show bottomSheet on LongPress
bottomSheetDialog.show(
(v?.context as FragmentActivity).supportFragmentManager, bottomSheetDialog.tag
)
return true
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.list_apps, parent, false
)
return ViewHolder(view)
}
override fun getItemCount() = listOfApps.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentItem = listOfApps[position]
holder.icon.setImageDrawable(currentItem.icon)
holder.name.text = currentItem.name
holder.size.text = currentItem.size
}
}
BottomSheetDialog.kt
class BottomSheetDialog: BottomSheetDialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.bottom_sheet, container, false)
}
override fun getTheme(): Int = R.style.RoundBottomSheetDialog
}
数据类
data class AppData(
val icon: Drawable,
val name: String,
val size: String,
)
解决方案
使用您当前的代码,最简单的解决方案是:
修改您的 BottomSheetDialog 以在构造函数中包含 AppData
类BottomSheetDialog(val appData:AppData):BottomSheetDialogFragment(){
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.bottom_sheet, container, false) } override fun getTheme(): Int = R.style.RoundBottomSheetDialog
}
在 ViewHolder 类中添加 onBind 方法:
fun onBind(appData: AppData) { icon.setImageDrawable(currentItem.icon) name.text = currentItem.name size.text = currentItem.size }
修改 Adapter 中的 onBindViewHolder 方法以调用该 onBind 方法:
覆盖乐趣 onBindViewHolder(holder: ViewHolder, position: Int) { holder.onBind(listOfApps[position]) }
在您的 ViewHolder 中添加
lateinit var currentItem: AppData
将在 onBind 中设置的内容,我们可以在以下位置使用它onLongClick
:类 ViewHolder(appView: View) : RecyclerView.ViewHolder(appView), View.OnClickListener, View.OnLongClickListener { . . . 覆盖 fun onLongClick(v: View?): Boolean {
// I want here on Long press BottomSheet appears with details **val bottomSheetDialog = BottomSheetDialog(currentItem)** // Show bottomSheet on LongPress bottomSheetDialog.show( (v?.context as FragmentActivity).supportFragmentManager, bottomSheetDialog.tag ) return true } **private lateinit var currentItem: AppData** fun onBind(appData: AppData) { **currentItem = appData** icon.setImageDrawable(currentItem.icon) name.text = currentItem.name size.text = currentItem.size }
推荐阅读
- django - For循环仅在django中的一个模板中工作
- javascript - 使用 react componentDidMount() 方法获取多个路由的 api 数据的标准模式是什么?
- azure-devops - 在 Azure DevOps 项目中的 wiki 部分显示最近的活动
- ios - 弹出到 SwiftUI 中的特定视图,就像我们使用“popToViewController”一样
- javascript - 具有多个标准的键值模式,使用正向外观开销
- javascript - 在 WriteStream 中修改或删除同一文件时处理文件的删除
- java - 如何根据其值更改地图的顺序?
- c++ - 如何获取元组的元素
- machine-learning - 数据归一化卷积自动编码器
- c# - 如何在嵌套的 ObservableCollection 中实现 ObversableCollectionChanged