为什么我的RecyclerView运行异常,且无法实现存款取款金额计算逻辑
代码修复方案
现存问题
- 语法错误:
addwidMessage、adddipMessage两个函数定义在onCreate方法内部,不符合Kotlin类的方法定义规则,会直接编译报错 - Adapter初始化传参错误:RvAdapter构造要求传入
ArrayList<String>类型的交易记录列表,你初始化时传入了this(Context对象),类型不匹配 - 点击事件绑定错误:你将存款、取款的触发逻辑绑定给了EditText输入框,而非对应的操作按钮,点击按钮不会触发对应逻辑
- 未维护总余额变量:直接修改余额显示控件的文本为
+/-拼接的字符串,没有做实际的数值加减计算,无法得到正确的总余额 - 未更新交易列表:存款/取款成功后没有把交易记录添加到
cash列表,也没有通知Adapter数据变更,RecyclerView自然没有内容展示
修复后代码
MainActivity.kt
package com.example.anhar import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { private lateinit var clRoot: ConstraintLayout private lateinit var bignum: TextView private lateinit var cash: ArrayList<String> private lateinit var rvMoney: RecyclerView private lateinit var diposte: EditText private lateinit var dipbtn: Button private lateinit var withdrow: EditText private lateinit var withbtn: Button // 新增总余额变量,初始为0 private var totalBalance: Double = 0.0 private lateinit var adapter: RvAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) clRoot = findViewById(R.id.clRoot) cash = ArrayList() rvMoney = findViewById<RecyclerView>(R.id.rvMoney) bignum = findViewById(R.id.amount) // 初始化Adapter时传入cash列表 adapter = RvAdapter(cash) rvMoney.adapter = adapter rvMoney.layoutManager = LinearLayoutManager(this) diposte = findViewById(R.id.dip) dipbtn = findViewById(R.id.dipbtn) withdrow = findViewById(R.id.with) withbtn = findViewById(R.id.withbtn) // 点击事件绑定给按钮而非输入框 dipbtn.setOnClickListener { adddipMessage() } withbtn.setOnClickListener { addwidMessage() } // 初始化显示余额 bignum.text = totalBalance.toString() } // 函数移到onCreate外部,作为类方法 private fun addwidMessage() { val w = withdrow.text.toString() if (w.isNotEmpty()) { val withdrawAmount = w.toDouble() // 扣除余额,如需判断余额是否足够可自行补充逻辑 totalBalance -= withdrawAmount // 添加交易记录到列表 cash.add("- $withdrawAmount") // 通知Adapter数据更新 adapter.notifyItemInserted(cash.size - 1) // 更新余额显示 bignum.text = totalBalance.toString() withdrow.text.clear() withdrow.clearFocus() } } private fun adddipMessage() { val d = diposte.text.toString() if (d.isNotEmpty()) { val depositAmount = d.toDouble() // 增加余额 totalBalance += depositAmount // 添加交易记录到列表 cash.add("+ $depositAmount") // 通知Adapter数据更新 adapter.notifyItemInserted(cash.size - 1) // 更新余额显示 bignum.text = totalBalance.toString() diposte.text.clear() diposte.clearFocus() } } }
RvAdapter.kt
原有代码无需修改,只要保证R.layout.rvmain布局中存在id为rvMoney的TextView控件即可正常运行。
内容的提问来源于stack exchange,提问作者Anhar AG
相关产品推荐
相关产品推荐

