使用 Kotlin 从 RecyclerAdapter 更改 MainActvity 中的 TextView
Change TextView in MainActvity from RecyclerAdapter using Kotlin
我想在单击 RecyclerView 中的按钮时更改 MainActivity 中 TextView (id: dailyTotalTextView) 中的文本。但是我收到一条错误消息,说 dailyTotalTextView 不能为空。
我对 Kotlin 有基本的了解,但没有 Java 经验,所以我可能会全错。
TextView 显示列表中值的总和。列表项包含一个数字和一个用于删除该项目的按钮。当我删除一个项目时,我希望 TextView 更改总数。
在 MainActivity 中,可以将一个项目添加到列表中,并且通过使用 .notifyDataSetChanged() 我可以将文本设置为新值。
DrinksToday 对象包含用于更改列表的变量和方法。
适配器持有删除按钮的onClick,所以它可以删除点击位置的项目。这也是我想更改 TextView 的地方。
主要活动:
class MainActivity : AppCompatActivity() {
private lateinit var adapter: TodayDrinksRecyclerAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainTextDailyTotal.text = dailyTotal.toString()
adapter = TodayDrinksRecyclerAdapter(this, DrinksToday.drinksTodayList)
drinksTodayList.adapter = adapter
val layoutManager = LinearLayoutManager(this)
drinksTodayList?.layoutManager = layoutManager
}
fun addWaterClick(@Suppress("UNUSED_PARAMETER") view: View) {
DrinksToday.addDrink()
adapter.notifyDataSetChanged()
mainTextDailyTotal.text = dailyTotal.toString()
}
}
DrinksToday 对象:
object DrinksToday {
var currentGlass = Drinks("water01", "250", "ml")
var dailyTotal = 0
var drinksTodayList: MutableList<Drinks> = mutableListOf()
fun addDrink() {
dailyTotal += currentGlass.volume.toInt()
drinksTodayList.add(0, currentGlass)
}
fun removeDrink(position: Int) {
drinksTodayList.removeAt(position)
}
}
编辑: 我更改了内部 class Holder,现在使用 kotlinx.android.synthetic 访问视图引用。
回收器适配器:
class TodayDrinksRecyclerAdapter(private val context: Context, private val todaysDrinks: MutableList<Drinks>) :
RecyclerView.Adapter<TodayDrinksRecyclerAdapter.Holder>() {
// ... standard adapter code here: onBindViewHolder, getItemCount, onCreateViewHolder
open inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindDrinks(drinks: Drinks, context: Context) {
itemView.drinkListText.text = drinks.volume
itemView.drinkListButtonDelete.setOnClickListener {
val position = adapterPosition
DrinksToday.removeDrink(position)
DrinksToday.dailyTotal -= drinks.volume.toInt()
notifyDataSetChanged()
val dailyTotalTextView = itemView.findViewById<TextView>(R.id.mainTextDailyTotal)
dailyTotalTextView.text = DrinksToday.dailyTotal.toString()
}
}
}
}
TextView XML:
<TextView
android:id="@+id/mainTextDailyTotal"
android:text="0"
android:layout_width="0dp"
android:layout_height="0dp"/>
当我 运行 此代码时,我收到一条错误消息:
java.lang.IllegalStateException: dailyTotalTextView must not be null at adapters.TodayDrinksRecyclerAdapter$Holder$bindDrinks.onClick(TodayDrinksRecyclerAdapter.kt:54)
指的是这行代码:
val dailyTotalTextView = itemView.findViewById<TextView>(R.id.mainTextDailyTotal)
我不明白为什么这个 TextView 是 Null。我希望这能奏效。希望有人能帮助我。
感谢 Lalit Behera 的回复和一些研究,我明白了。
我将此接口添加到我的 RecylerAdapter:
interface OnItemClickListener {
fun onItemClick(dailyTotal: Int)
}
通过添加 OnItemClickListener 更改了 RecyclerAdapter 的构造函数:
class TodayDrinksRecyclerAdapter(private val context: Context, private val todayDrinks: MutableList<Drinks>,
private var onItemClickListener: OnItemClickListener)
我在 class Holder 的 setOnClickListenr 中添加了:
itemView.drinkListButtonDelete.setOnClickListener {
val position = adapterPosition
DrinksToday.removeDrink(position)
dailyTotal -= drinks.volume.toInt()
notifyDataSetChanged()
// added this line
onItemClickListener.onItemClick(dailyTotal)
}
然后在 MainActivity 中我的适配器变成了:
adapter = TodayDrinksRecyclerAdapter(this, DrinksToday.drinksTodayList, object : TodayDrinksRecyclerAdapter.OnItemClickListener {
override fun onItemClick(dailyTotal: Int) {
mainTextDailyTotal.text = dailyTotal.toString()
}
})
我想在单击 RecyclerView 中的按钮时更改 MainActivity 中 TextView (id: dailyTotalTextView) 中的文本。但是我收到一条错误消息,说 dailyTotalTextView 不能为空。
我对 Kotlin 有基本的了解,但没有 Java 经验,所以我可能会全错。
TextView 显示列表中值的总和。列表项包含一个数字和一个用于删除该项目的按钮。当我删除一个项目时,我希望 TextView 更改总数。
在 MainActivity 中,可以将一个项目添加到列表中,并且通过使用 .notifyDataSetChanged() 我可以将文本设置为新值。
DrinksToday 对象包含用于更改列表的变量和方法。
适配器持有删除按钮的onClick,所以它可以删除点击位置的项目。这也是我想更改 TextView 的地方。
主要活动:
class MainActivity : AppCompatActivity() {
private lateinit var adapter: TodayDrinksRecyclerAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainTextDailyTotal.text = dailyTotal.toString()
adapter = TodayDrinksRecyclerAdapter(this, DrinksToday.drinksTodayList)
drinksTodayList.adapter = adapter
val layoutManager = LinearLayoutManager(this)
drinksTodayList?.layoutManager = layoutManager
}
fun addWaterClick(@Suppress("UNUSED_PARAMETER") view: View) {
DrinksToday.addDrink()
adapter.notifyDataSetChanged()
mainTextDailyTotal.text = dailyTotal.toString()
}
}
DrinksToday 对象:
object DrinksToday {
var currentGlass = Drinks("water01", "250", "ml")
var dailyTotal = 0
var drinksTodayList: MutableList<Drinks> = mutableListOf()
fun addDrink() {
dailyTotal += currentGlass.volume.toInt()
drinksTodayList.add(0, currentGlass)
}
fun removeDrink(position: Int) {
drinksTodayList.removeAt(position)
}
}
编辑: 我更改了内部 class Holder,现在使用 kotlinx.android.synthetic 访问视图引用。
回收器适配器:
class TodayDrinksRecyclerAdapter(private val context: Context, private val todaysDrinks: MutableList<Drinks>) :
RecyclerView.Adapter<TodayDrinksRecyclerAdapter.Holder>() {
// ... standard adapter code here: onBindViewHolder, getItemCount, onCreateViewHolder
open inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bindDrinks(drinks: Drinks, context: Context) {
itemView.drinkListText.text = drinks.volume
itemView.drinkListButtonDelete.setOnClickListener {
val position = adapterPosition
DrinksToday.removeDrink(position)
DrinksToday.dailyTotal -= drinks.volume.toInt()
notifyDataSetChanged()
val dailyTotalTextView = itemView.findViewById<TextView>(R.id.mainTextDailyTotal)
dailyTotalTextView.text = DrinksToday.dailyTotal.toString()
}
}
}
}
TextView XML:
<TextView
android:id="@+id/mainTextDailyTotal"
android:text="0"
android:layout_width="0dp"
android:layout_height="0dp"/>
当我 运行 此代码时,我收到一条错误消息:
java.lang.IllegalStateException: dailyTotalTextView must not be null at adapters.TodayDrinksRecyclerAdapter$Holder$bindDrinks.onClick(TodayDrinksRecyclerAdapter.kt:54)
指的是这行代码:
val dailyTotalTextView = itemView.findViewById<TextView>(R.id.mainTextDailyTotal)
我不明白为什么这个 TextView 是 Null。我希望这能奏效。希望有人能帮助我。
感谢 Lalit Behera 的回复和一些研究,我明白了。
我将此接口添加到我的 RecylerAdapter:
interface OnItemClickListener {
fun onItemClick(dailyTotal: Int)
}
通过添加 OnItemClickListener 更改了 RecyclerAdapter 的构造函数:
class TodayDrinksRecyclerAdapter(private val context: Context, private val todayDrinks: MutableList<Drinks>,
private var onItemClickListener: OnItemClickListener)
我在 class Holder 的 setOnClickListenr 中添加了:
itemView.drinkListButtonDelete.setOnClickListener {
val position = adapterPosition
DrinksToday.removeDrink(position)
dailyTotal -= drinks.volume.toInt()
notifyDataSetChanged()
// added this line
onItemClickListener.onItemClick(dailyTotal)
}
然后在 MainActivity 中我的适配器变成了:
adapter = TodayDrinksRecyclerAdapter(this, DrinksToday.drinksTodayList, object : TodayDrinksRecyclerAdapter.OnItemClickListener {
override fun onItemClick(dailyTotal: Int) {
mainTextDailyTotal.text = dailyTotal.toString()
}
})