You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:51:02