Я хочу изменить текст в TextView (id: dailyTotalTextView) в MainActivity, когда я нажимаю кнопку в RecyclerView. Но я получаю сообщение о том, что dailyTotalTextView не должен быть нулевым.
У меня есть базовые знания о Kotlin и нет опыта работы с Java, поэтому я могу ошибаться по этому поводу.
TextView отображает сумму значений в списке. Элементы списка содержат номер и кнопку для удаления элемента. Когда я удаляю элемент, я хочу, чтобы TextView изменил сумму.
В MainActivity элемент может быть добавлен в список, и с помощью .notifyDataSetChanged () я могу установить для текста новое значение.
Объект DrinksToday содержит переменные и методы для изменения списка.
Адаптер удерживает кнопку onClick для кнопки удаления, поэтому он может удалить элемент в позиции, по которой щелкнули. Здесь я также хотел изменить TextView.
MainActivity:
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)
}
}
Редактировать: Я изменил внутренний класс Holder и теперь использую kotlinx.android.synthetic для доступа к ссылкам вида.
RecyclerAdapter:
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$1.onClick(TodayDrinksRecyclerAdapter.kt:54)
К этой строке относится код:
val dailyTotalTextView = itemView.findViewById<TextView>(R.id.mainTextDailyTotal)
Я не понимаю, почему этот TextView имеет значение Null. Я ожидаю, что это сработает. Надеюсь, кто-нибудь может мне помочь.