Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Kotlin从RecyclerAdapter更改MainActivity中的文本视图_Android_Kotlin_Textview_Android Recyclerview - Fatal编程技术网

Android 使用Kotlin从RecyclerAdapter更改MainActivity中的文本视图

Android 使用Kotlin从RecyclerAdapter更改MainActivity中的文本视图,android,kotlin,textview,android-recyclerview,Android,Kotlin,Textview,Android Recyclerview,当我单击RecyclerView中的按钮时,我想更改MainActivity中TextView(id:dailyTotalTextView)中的文本。但是我得到一个错误,dailyTotalTextView不能为null 我对Kotlin有基本的了解,没有Java经验,所以我可能在这一点上完全错了 TextView在列表中显示值的总和。列表项包含一个数字和一个删除该项的按钮。当我删除一个项目时,我希望TextView更改总数 在MainActivity中,可以将项目添加到列表中,并使用.noti

当我单击RecyclerView中的按钮时,我想更改MainActivity中TextView(id:dailyTotalTextView)中的文本。但是我得到一个错误,dailyTotalTextView不能为null

我对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)
    }
}
这是指这一行代码:

val dailyTotalTextView = itemView.findViewById<TextView>(R.id.mainTextDailyTotal)
val dailyTotalTextView=itemView.findViewById(R.id.mainTextDailyTotal)

我不明白为什么这个文本视图是空的。我希望这能奏效。希望有人能帮助我。

多亏了Lalit Behera的回复和一些研究,我才弄明白

我将此界面添加到RecylerAdapter:

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()
            }
        }
    }
}
interface OnItemClickListener {
    fun onItemClick(dailyTotal: Int)
}
通过添加侦听器更改了RecyclerAdapter的构造函数:

class TodayDrinksRecyclerAdapter(private val context: Context, private val todayDrinks: MutableList<Drinks>,
                                 private var onItemClickListener: OnItemClickListener)
然后在MainActivity中,我的适配器变成:

adapter = TodayDrinksRecyclerAdapter(this, DrinksToday.drinksTodayList, object : TodayDrinksRecyclerAdapter.OnItemClickListener {
            override fun onItemClick(dailyTotal: Int) {
                mainTextDailyTotal.text = dailyTotal.toString()
            }
        })

如果您做错了,您必须创建一个回调,该回调将通知您的MainActivity,该项目已在recycler视图中单击。使用接口创建回调。任何尝试使用“kotlinx.android.synthetic”访问视图引用的人。谢谢,我确实更改了视图引用,请参见编辑。
class TodayDrinksRecyclerAdapter(private val context: Context, private val todayDrinks: MutableList<Drinks>,
                                 private var onItemClickListener: OnItemClickListener)
itemView.drinkListButtonDelete.setOnClickListener {
    val position = adapterPosition
    DrinksToday.removeDrink(position)
    dailyTotal -= drinks.volume.toInt()
    notifyDataSetChanged()

    // added this line
    onItemClickListener.onItemClick(dailyTotal)
}
adapter = TodayDrinksRecyclerAdapter(this, DrinksToday.drinksTodayList, object : TodayDrinksRecyclerAdapter.OnItemClickListener {
            override fun onItemClick(dailyTotal: Int) {
                mainTextDailyTotal.text = dailyTotal.toString()
            }
        })