【问题标题】:Is there any way to refresh custom view inside baseadapter after updating data?更新数据后,有什么方法可以刷新 baseadapter 中的自定义视图?
【发布时间】:2019-09-12 02:04:20
【问题描述】:

我在 listview 上显示的 baseadapter 中有一个自定义视图。目前我可以更新数据库中的项目,但我无法刷新视图。我想在更新后自动刷新视图。还有什么要刷新的吗?请看我的代码。

这是模型类-

class Item_Detail {
   var qty:Int = 0
   var id:Int = 0
   constructor()}

这是DatabaseHandler-

  val Detail: List<Item_Detail>
    get() {
        val bb=this.writableDatabase
        val seItem=ArrayList<Item_Detail>()
        val myPath=DB_PATH + REAL_DATABASE
        val db=SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY)
        val selectQuery="Select * From Transaction_table Where date='$rowview_date' And location='$rowview_location'"
        val cursor=db.rawQuery(selectQuery, null)

        if (cursor.moveToFirst()) {

            do {
                val item=Item_Detail()
                item.id=cursor.getInt(cursor.getColumnIndex("_id2"))
                item.qty=cursor.getInt(cursor.getColumnIndex("quantity2"))
                seItem.add(item)
            } while(cursor.moveToNext())
        }
        db.close()
        return seItem
    }

这是 MainActivity-

class Detail : AppCompatActivity() {

internal lateinit var db: DataBaseHelper
internal var seItem: List<Item_Detail> = ArrayList<Item_Detail>()

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

    db = DataBaseHelper(this)
    detail_date.text = rowview_date.toString()
    detail_location.text = rowview_location.toString()
    getDetail()


}
private fun getDetail() {
    seItem = db.Detail
    val adapter = Adapter_detail(this, seItem,this)
    list_detail.adapter=adapter
    list_detail.invalidate()
}}

这是适配器类-

  class Adapter_detail(
    internal var activity: Activity,
    internal var stitem: List<Item_Detail>,
    val context:Context

    ) : BaseAdapter() {

internal lateinit var db: DataBaseHelper
internal var inflater: LayoutInflater

init {
    inflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
}

override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

    val rowView:View
    rowView = inflater.inflate(R.layout.detail_row, null)
    rowView.detail_id.text = stitem[position].id.toString()
    rowView.detail_qty.text = stitem[position].qty.toString()


    rowView.btn_detail.setOnClickListener{
        db=DataBaseHelper(context)//Initiate the database
        val builder=android.app.AlertDialog.Builder(context)
        inflater=activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

        val view=inflater.inflate(R.layout.edit_layout, null)
        builder.setView(view)
        val dialog: android.app.AlertDialog=builder.create()

        var tran_edit=view.findViewById<EditText>(R.id.edt_edit)
        tran_edit.setText(stitem[position].qty.toString())

        dialog.show()

        var btn_edt=view.findViewById<Button>(R.id.btn_edit)
        btn_edt.setOnClickListener {
            val item=Item(
                Integer.parseInt(stitem[position].id.toString()),
                Integer.parseInt(1.toString()),
                tran_edit.text.toString(),
                name.toString(),
                record_date.toString(),
                record_location.toString(),
                master_record.toString().toInt()
            )
            db.updateItem(item)
            dialog.dismiss()
        }
    }

    return rowView

}

override fun getItem(position: Int): Any {
    return stitem[position]
}

override fun getItemId(position: Int): Long {
    return stitem[position].id!!.toLong()
}

override fun getCount(): Int {
    return stitem.size
}

【问题讨论】:

    标签: android listview kotlin baseadapter


    【解决方案1】:

    刷新数据时,您需要在 adapter 对象上调用 notifyDataSetChanged()。您需要进行以下更改才能使用它,

    MainActivity

    class Detail : AppCompatActivity() {
    
        internal lateinit var db: DataBaseHelper
        internal var seItem: MutableList<Item_Detail> = ArrayList<Item_Detail>()
        internal lateinit var adapter : Adapter_detail
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_detail)
    
            db = DataBaseHelper(this)
            detail_date.text = rowview_date.toString()
            detail_location.text = rowview_location.toString()
            adapter = Adapter_detail(this, seItem,this)
            list_detail.adapter=adapter
            getDetail()
        }
    
        private fun getDetail() {
            adapter.refresh(db.Detail)
        }
    
    }
    

    适配器类

    class Adapter_detail(
        internal var activity: Activity,
        internal var stitem: MutableList<Item_Detail>,
        val context:Context
    
        ) : BaseAdapter() {
    
        ...
    
        fun refresh(newList: List<Item_Detail>) {
             stitem.clear()
             stitem.addAll(newList)
             notifyDataSetChanged()
        }
    
    }
    

    注意我使用移动设备编写了此解决方案,因此请原谅任何语法错误。 让我知道它是否有效?

    附:有一个更好的适配器实现,即CursorAdapter,它专为与数据库游标一起使用而设计。你可以关注这个tutorial来整合它。

    更新

    我忘了一件事,您需要在执行更新操作的getView() 函数中的ClickListener 回调中调用refresh()。因此,它将如下所示,

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        ...
    
            btn_edt.setOnClickListener {
                val item= ...
                db.updateItem(item)
                dialog.dismiss()
                refresh(db.Detail)
            }
        }
    
        return rowView
    }
    

    【讨论】:

    • 多么出色的代码。我真的很感谢你的帮助。我对您的代码进行了一点编辑以使其完美,从 List 到 MutableList
    • 我很乐意提供帮助。快乐编码:)
    猜你喜欢
    • 2021-11-05
    • 2016-05-03
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多