首页 > 解决方案 > 如何将数据从 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 传递它,它代表某些项目的子路径。我也试图找到另一种在网络中实现的变体,但没有成功。

标签: androidkotlinandroid-recyclerviewdialogfragment

解决方案


尝试使用接口将对象 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


推荐阅读