Kotlin SQLite计数应用如何在ViewHolder中显示COLUMN_COUNT字段值
解决方案
你需要将计数和日期统一封装后传给Adapter,避免分开查询导致的数据错位,也不需要在Adapter中直接操作数据库,修改步骤如下:
步骤1:新建实体类封装历史记录数据
新建HistoryItem.kt统一存储单条历史记录的计数和日期:
package com.example.thesupremecounter data class HistoryItem( val count: String, val date: String )
步骤2:修改SqliteOpenHelper代码
首先修正插入语句的语法错误(字段名不需要加单引号),然后新增统一查询方法,可删除原来的retrieveCount和getAllCompletedDatesList方法:
// SqliteOpenHelper.kt // 修正addDate方法的SQL语法 fun addDate(count: String, date: String ) { val values = "INSERT INTO $TABLE_HISTORY " + "($COLUMN_COUNT, $COLUMN_COMPLETED_DATE)" + " VALUES " + "('$count', '$date')" val db = this.writableDatabase db.execSQL(values) db.close() } // 新增统一查询所有历史记录的方法 fun getAllHistoryItems(): ArrayList<HistoryItem> { val list = ArrayList<HistoryItem>() val db = this.readableDatabase val cursor = db.rawQuery("SELECT * FROM $TABLE_HISTORY", null) while (cursor.moveToNext()) { val count = cursor.getString(cursor.getColumnIndex(COLUMN_COUNT)) val date = cursor.getString(cursor.getColumnIndex(COLUMN_COMPLETED_DATE)) list.add(HistoryItem(count, date)) } cursor.close() db.close() return list }
步骤3:修改HistoryActivity查询逻辑
调用新的查询方法获取封装好的列表,传给Adapter:
// HistoryActivity.kt private fun getAllCompletedDates() { val dbHandler = SqliteOpenHelper(this, null) val allHistoryList = dbHandler.getAllHistoryItems() val tvHistory = findViewById<TextView>(R.id.tvHistory) val rvHistory = findViewById<androidx.recyclerview.widget.RecyclerView>(R.id.rvHistory) val tvNoDataAvailable = findViewById<TextView>(R.id.tvNoDataAvailable) if (allHistoryList.size > 0) { tvHistory.visibility = View.VISIBLE rvHistory.visibility = View.VISIBLE tvNoDataAvailable.visibility = View.GONE rvHistory.layoutManager = LinearLayoutManager(this) val historyAdapter = HistoryAdapter(this, allHistoryList) rvHistory.adapter = historyAdapter } else { tvHistory.visibility = View.GONE rvHistory.visibility = View.GONE tvNoDataAvailable.visibility = View.VISIBLE } }
步骤4:修改HistoryAdapter接收封装数据
调整Adapter的入参类型,绑定数据时直接取对应的字段即可:
// HistoryAdapter.kt class HistoryAdapter(val context: Context, val items: ArrayList<HistoryItem>) : RecyclerView.Adapter<HistoryAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder( LayoutInflater.from(context).inflate( R.layout.item_history_row, parent, false ) ) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = items[position] holder.tvPosition.text = (position + 1).toString() holder.tvCount.text = item.count // 直接赋值计数值 holder.tvItem.text = item.date // 赋值日期 if (position % 2 == 0) { holder.llHistoryItemMain.setBackgroundColor( Color.parseColor("#EBEBEB") ) } else { holder.llHistoryItemMain.setBackgroundColor( Color.parseColor("#FFFFFF") ) } } override fun getItemCount(): Int = items.size class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val llHistoryItemMain = view.ll_history_item_main!! val tvItem = view.tvItem!! val tvPosition = view.tvPosition!! val tvCount = view.tvCount!! } }
修改完成后先卸载重装App清除旧的错误数据库,再运行测试即可正常展示计数和日期。
内容的提问来源于stack exchange,提问作者Georgew980
相关产品推荐
相关产品推荐

