android - 如何将数据从 RecyclerView 传递到 Kotlin 中的 DialogFragment?
问题描述
我的 RecyclerView 有一个项目列表,每个项目都有可点击的“删除图标”,它会从列表中删除项目。如何使用 DialogFragment 确认删除?
这是 FeedAdapter(我的 RecyclerView 适配器)的代码:
class FeedAdapter(private val posts: List<FeedPost>) : RecyclerView.Adapter<FeedAdapter.ViewHolder>() {
private val listener: (() -> Unit)? = null
fun setListener(listener: (() -> Unit)?) {
this.listener = listener
}
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
val view = LayoutInflater.from(parent.context).inflate(R.layout.adapt_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val post = posts[position]
with(holder.view) {
user_photo_image.loadUserPhoto(posts[position].photo)
date_text.text = post.kogda
caption_text.setCaptionText(nachalo, post.caption)
test.text = post.ur
delete_image.setOnClickListener { listener?.invoke() }
}
}
override fun getItemCount() = posts.size
private fun ImageView.loadUserPhoto(photoUrl: String?) {
if (!(context as Activity).isDestroyed) {
GlideApp.with(this).load(photoUrl).fallback(R.drawable.person).into(this)
}
}
}
因此,当您单击 delete_image 时,DeleteDialog 会出现两个按钮 - “OK”和“CANCEL”。如何通过单击“确定”按钮进行确认并从列表中删除项目?
这是我的 DeleteDialog 的代码:
class DeleteDialog : DialogFragment() {
override fun onAttach(context: Context) {
super.onAttach(context)}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val view = activity!!.layoutInflater.inflate(R.layout.dialog_delete, null)
return AlertDialog.Builder(context).setView(view)
.setPositiveButton(android.R.string.ok, {_, _ -> })
.setNegativeButton(android.R.string.cancel, {_, _ -> })
.setTitle("Are you sure you want to delete?").create()
}
}
我试着用这个:
.setPositiveButton(android.R.string.ok, {_, _ ->
mDatabase.child("feed-posts").child("${post.ur}").removeValue()
但不幸的是,它无法识别“post.ur”引用,我试图从 ViewHolder 传递它,它代表某些项目的子路径。我也试图找到另一种在网络中实现的变体,但没有成功。
解决方案
尝试使用接口将对象 post 发送回来,创建一个接口
interface ClickPost {
fun postClicked(mPost: Post)}
在你的适配器上你在一个变量中实现
class FeedAdapter(private val posts: List<FeedPost>, val click: ClickPost)
点击里面的onBind:
delete_image.setOnClickListener { click.postClicked(post) }
像这样你可以在包含这个适配器的片段/活动中取回它,你可以通过包或参数将帖子发送到 dialogFragment
推荐阅读
- python - Python - Django,无法使用 pip 安装 mysqlclient
- json - 无法评估结构类型中的字段实例:AlertManager
- r - 重投影栅格数据时的极值较少
- palantir-foundry - 在 Contour 中展开、取消嵌套或展平数组
- firebase - FLUTTER:如何使用 Cloud Firestore 中的 where 子句删除多个文档?
- c# - Microsoft.AspNetCore.Blazor.HttpClient GetJsonAsync 不处理空结果
- xcode - 找不到 NSFileProviderItemDecorating 的协议声明
- ffmpeg - 连接两个文件,同时分别保持与两个文件相同的持续时间
- ios - 无法使用 Realm Studio 或 Realm Browser 打开 default.realm 文件
- palantir-foundry - 为代码工作簿复制或使用另存为