繁体   English   中英

在 kotlin 中使用 sqlite 数据库更新回收站视图时出现问题

[英]Problems updating recycler views with sqlite database in kotlin

我正在编写一个代码,当按下弹出菜单的按钮时从数据库中删除该项目,并根据回收器查看器将其删除。 选定的项目会从数据库中删除,但不会从回收站视图中删除。

错误代码:无错误代码

打印活动.kt

class PrintActivity : AppCompatActivity() {
    val helper = SqliteHelper(this, "myDB.sql", 1)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val vBinding = ActivityPrintBinding.inflate(layoutInflater)
        setContentView(vBinding.root)

        var recyclerViewAdapter = CustomAdapter()
        recyclerViewAdapter.listData = helper.select()
        vBinding.myRecyclerView.adapter = recyclerViewAdapter
        vBinding.myRecyclerView.layoutManager = LinearLayoutManager(this)
        vBinding.myRecyclerView.addItemDecoration(
            DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
        )
    }

    inner class CustomAdapter : RecyclerView.Adapter<CustomAdapter.Holder>(){
        var listData = ArrayList<questionType>()
        inner class Holder(val vBinding: QuestionLayoutRecyclerBinding) :
            RecyclerView.ViewHolder(vBinding.root){

                fun setData(id:Int?, question: String, answer: String, exp: String) {
                    vBinding.printId.text=id.toString()

                    vBinding.myLinear.setOnClickListener {
                        var myPopupMenu = PopupMenu(this@PrintActivity, it)
                        menuInflater?.inflate(R.menu.menu, myPopupMenu.menu)
                        var listener = PopupMenuListener()
                        myPopupMenu.setOnMenuItemClickListener(listener)
                        myPopupMenu.show()
                    }
                }

            inner class PopupMenuListener:PopupMenu.OnMenuItemClickListener{
                override fun onMenuItemClick(p0: MenuItem?): Boolean {
                    listData[adapterPosition].id?.let { helper.delete(it) }
                    //here
                    this@CustomAdapter.notifyDataSetChanged()
                    return false
                }
            }
         }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.Holder {
            val vBinding = QuestionLayoutRecyclerBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
            return Holder(vBinding)
        }

        override fun onBindViewHolder(holder: Holder, position: Int) {
            val question = listData[position]
            holder.setData(question.id, question.question, question.answer, question.exp)
        }

        override fun getItemCount(): Int {
            return listData.size
        }

    }

}


您可以使用更高阶的 function 作为回调机制来尝试这种方法。 我会给出的一个建议是,您可以尝试避免这些嵌套的内部类并制作成单独的文件。 希望它有效

   inner class CustomAdapter : RecyclerView.Adapter<CustomAdapter.Holder>(){
        var listData = ArrayList<questionType>()
    
        fun deleteItem(position: Int) { //Function to remove recyclerview item
            listData.remove(position)
            notifyItemRemoved(position)
            notifyItemRangeChanged(position, getItemCount())
        }
        
        inner class Holder(val vBinding: QuestionLayoutRecyclerBinding) :
            RecyclerView.ViewHolder(vBinding.root){
    
            fun setData(id:Int?, question: String, answer: String, exp: String,itemRemovedCallback:(a:Int)->Unit) { //higher order callback function
                vBinding.printId.text=id.toString()
    
                vBinding.myLinear.setOnClickListener {
                    var myPopupMenu = PopupMenu(this@PrintActivity, it)
                    menuInflater?.inflate(R.menu.menu, myPopupMenu.menu)
                    var listener = PopupMenuListener(itemRemovedCallback) //Passed to popupmenu listener
                    myPopupMenu.setOnMenuItemClickListener(listener)
                    myPopupMenu.show()
                }
            }
    
            inner class PopupMenuListener(val itemRemovedCallback:(a:Int)->Unit):PopupMenu.OnMenuItemClickListener{
                override fun onMenuItemClick(p0: MenuItem?): Boolean {
                    listData[adapterPosition].id?.let { helper.delete(it) }
                    itemRemovedCallback.invoke(adapterPosition) //Calling function. It will pass position to function in adapter
                    return false
                }
            }
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.Holder {
            val vBinding = QuestionLayoutRecyclerBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
            return Holder(vBinding)
        }
    
        override fun onBindViewHolder(holder: Holder, position: Int) {
            val question = listData[position]
            holder.setData(question.id, question.question, question.answer, question.exp,::deleteItem) //Passing function as higher order function to viewholder
        }
    
        override fun getItemCount(): Int {
            return listData.size
        }
    
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM