【问题标题】:Kotlin: Show AlertDialog when RecycleView item clickedKotlin:单击 RecycleView 项目时显示 AlertDialog
【发布时间】:2020-07-03 14:45:59
【问题描述】:

现在我正在研究在单击 RecyclerView 项目时显示 AlertDialog。 但是,我不知道如何为点击监听器设置适配器。 你能给我一个小费吗?

首先,我尝试将 AlertDialog 放在这个 Main Activity 中。 这是正确的位置吗?

主活动

class MainActivity : AppCompatActivity() {

    private val foodList = listOf(
        FoodModel("Noodle", 2),
        FoodModel("Cake", 3),
        FoodModel("Pizza", 4),
        FoodModel("Stake", 5),
        FoodModel("Chicken", 4)
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val adapter = FoodDataAdapter(foodList)
        adapter.notifyDataSetChanged()
        foodListView.adapter = adapter
        foodListView.layoutManager = LinearLayoutManager(this)

        fun onItemClick(item: FoodModel, position: Int) {
            val dialog = AlertDialog.Builder(this)
            dialog.setTitle("Item deletion")
            dialog.setMessage("Do you want to delete this item?")
            dialog.setPositiveButton("Yes", DialogInterface.OnClickListener { _, _ ->
            })
            dialog.setNegativeButton("No", DialogInterface.OnClickListener { _, _ ->
            })
            dialog.setNeutralButton("Cancel", DialogInterface.OnClickListener { _, _ ->
            })
            dialog.show()
        }
    }
}

这是适配器。

class FoodDataAdapter(val list: List<FoodModel>):RecyclerView.Adapter<FoodDataViewHolder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FoodDataViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_food,parent,false)
        return FoodDataViewHolder(view)
    }

    override fun getItemCount(): Int {
       return list.count()
    }

    override fun onBindViewHolder(holder: FoodDataViewHolder, position: Int) {
        holder.containerView.nameText.text=list[position].name
        holder.containerView.priceText.text="${list[position].price}dollar"
    }
}

视图支架

class FoodDataViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView),LayoutContainer

【问题讨论】:

    标签: kotlin android-alertdialog android-recyclerview onitemclicklistener


    【解决方案1】:

    我编辑了你的代码。主要活动:

    class MainActivity : AppCompatActivity(), FoodDataAdapter.OnItemClickListener {
    
    var foodList = ArrayList<FoodModel>()
    lateinit var adapter : FoodDataAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        foodlist.add(FoodModel("Noodle", 2))
        foodlist.add(FoodModel("Cake", 3))
        foodlist.add(FoodModel("Pizza", 4))
        foodlist.add(FoodModel("Stake", 5))
        foodlist.add(FoodModel("Chicken", 4))
    
        adapter = FoodDataAdapter(foodList, this)
        foodListView.adapter = adapter
        foodListView.layoutManager = LinearLayoutManager(this)
    
    }
    
    override fun alertDialog(position: Int) {
        val dialog = AlertDialog.Builder(this)
        dialog.setTitle("Item deletion")
        dialog.setMessage("Do you want to delete this item?")
        dialog.setPositiveButton("Yes", DialogInterface.OnClickListener { _, _ -> 
        adapter.removeItem(position)
        })
        dialog.setNegativeButton("No", DialogInterface.OnClickListener { _, _ ->
        })
        dialog.setNeutralButton("Cancel", DialogInterface.OnClickListener { _, _ ->
        })
        dialog.show()
    }
    }
    

    食物数据适配器:

    class FoodDataAdapter(var list: ArrayList<FoodModel>, var listener : FoodDataAdapter.OnItemClickListener):RecyclerView.Adapter<FoodDataAdapter.FoodDataViewHolder>(){
    
    interface OnItemClickListener {
        fun alertDialog(position : Int)
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FoodDataViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_food,parent,false)
        return FoodDataViewHolder(view)
    }
    
    override fun getItemCount(): Int {
        return list.count()
    }
    
    fun removeItem(position: Int) {
        list.removeAt(position)
        notifyItemRemoved(position)
    }
    
    override fun onBindViewHolder(holder: FoodDataViewHolder, position: Int) {
        holder.nameText.text=list[position].name
        holder.priceText.text="${list[position].price}dollar"
    }
    
    inner class FoodDataViewHolder(containerView: View) : RecyclerView.ViewHolder(containerView),
        View.OnClickListener {
    
        var nameText: TextView = containerView.findViewById(R.id.nameText)
        var priceText: TextView = containerView.findViewById(R.id.priceText)
    
        init {
            containerView.setOnClickListener(this)
        }
    
        override fun onClick(v: View?) {
            listener.alertDialog(adapterPosition)
        }
    }
    }
    

    【讨论】:

    • 不过,我可以再问一件事吗?当我单击 AlertDialog 中的“是”按钮时,如何删除选定的列表?
    • 嗯..我有两个错误。一个来自 FoodDataAdapter 中的list.remove(position)。消息是“未解析的引用。由于接收器类型不匹配,以下候选者都不适用。第二个错误是在主要活动中,即var adapter: FoodDataAdapter = null。消息是“Null 不能是非空类型的值FoodDataAdapter"
    • list.removeAt(position),lateinit var 适配器:FoodDataAdapter
    • 它仍然是错误,“未解决的参考”。我认为我们需要声明“removeAt”。你觉得怎么样?
    • 我想,你使用了arraylist。将您的列表更改为 ArrayList。然后就可以了
    【解决方案2】:

    我只是像这样在适配器的末尾添加了“removeAt”的声明代码,

    class FoodDataAdapter(val list: List<FoodModel>,var itemClicklistener : OnItemClickListener):RecyclerView.Adapter<FoodDataAdapter.FoodDataViewHolder>() {
    
        interface OnItemClickListener {
            fun onItemClick(position: Int)
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FoodDataViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.item_food, parent, false)
            return FoodDataViewHolder(view)
        }
    
        override fun getItemCount(): Int {
            return list.count()
        }
    
        fun removeItem(position: Int) {
            list.removeAt(position)
            notifyItemRemoved(position)
        }
    
        override fun onBindViewHolder(holder: FoodDataViewHolder, position: Int) {
            holder.nameText.text = list[position].name
            holder.priceText.text = "${list[position].price} dollar"
        }
    
        inner class FoodDataViewHolder(containerView: View) : RecyclerView.ViewHolder(containerView),
            View.OnClickListener {
            var nameText: TextView = containerView.findViewById(R.id.nameText)
            var priceText: TextView = containerView.findViewById(R.id.priceText)
    
            init {
                containerView.setOnClickListener(this)
            }
    
            override fun onClick(v: View?) {
                itemClicklistener.onItemClick(adapterPosition)
            }
        }
    }
    
    private fun Any.removeAt(position: Int) {
    
    }
    

    并且还像这样更改了主要活动。

    class MainActivity : AppCompatActivity(), FoodDataAdapter.OnItemClickListener {
    
        private val foodList = arrayListOf(
            FoodModel("Noodle", 3),
            FoodModel("Cake", 5),
            FoodModel("Pizza", 7),
            FoodModel("Stake", 8),
            FoodModel("Chicken", 8)
        )
        var adapter: FoodDataAdapter? = null
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            adapter = FoodDataAdapter(foodList, this)
            foodListView.adapter = adapter
            foodListView.layoutManager = LinearLayoutManager(this)
        }
    
        override fun onItemClick(position: Int) {
            val dialog = AlertDialog.Builder(this)
            dialog.setTitle("Item deletion")
            dialog.setMessage("Do you want to delete this item?")
            dialog.setPositiveButton("Yes", DialogInterface.OnClickListener { _, _ ->
                adapter?.removeItem(position)
            })
            dialog.setNegativeButton("No", DialogInterface.OnClickListener { _, _ ->
            })
            dialog.setNeutralButton("Cancel", DialogInterface.OnClickListener { _, _ ->
            })
            dialog.show()
        }
    }
    

    而且它有效!但是……一个问题是…… 删除列表后,最后一个列表保留出现。 列表总数没有减少..

    哈哈 又一个“鸡”出现了。你知道怎么解决吗?

    【讨论】:

    • 像我的回答一样将您的列表转换为 arrayList。并删除行 Any.removeAt(position: Int)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多