Изменить TextView в MainActvity из RecyclerAdapter с помощью Kotlin - PullRequest
0 голосов
/ 01 июня 2019

Я хочу изменить текст в 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. Я ожидаю, что это сработает. Надеюсь, кто-нибудь может мне помочь.

1 Ответ

0 голосов
/ 02 июня 2019

Я понял это, благодаря ответу Лали Бехера и некоторым исследованиям.

Я добавил этот интерфейс в свой RecylerAdapter:

interface OnItemClickListener {
    fun onItemClick(dailyTotal: Int)
}

Изменил конструктор RecyclerAdapter надобавив OnItemClickListener:

class TodayDrinksRecyclerAdapter(private val context: Context, private val todayDrinks: MutableList<Drinks>,
                                 private var onItemClickListener: OnItemClickListener)

И к setOnClickListenr в класс Holder я добавил:

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()
            }
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...