Android 如何从适配器类更改TextView文本?
我需要根据我的Android 如何从适配器类更改TextView文本?,android,kotlin,Android,Kotlin,我需要根据我的单击listener功能更改文本。我使用findViewById方法获取textview,并使用setText更改textview的文本,但在这里我得到一个错误,它是nullexception。我是Kotlin的新手,没有Java经验。我做了一项研究,我看到了接口方法来更改文本,我试过了,但没用。我怎样才能解决它 下面是来自适配器类的我的代码: var dd = holder.customView.findViewById<TextView>(R.id.toplamSa
单击listener
功能更改文本。我使用findViewById
方法获取textview
,并使用setText
更改textview
的文本,但在这里我得到一个错误,它是nullexception。我是Kotlin的新手,没有Java经验。我做了一项研究,我看到了接口方法
来更改文本,我试过了,但没用。我怎样才能解决它
下面是来自适配器类的我的代码:
var dd = holder.customView.findViewById<TextView>(R.id.toplamSayi)!!
dd.setText(tt)
private class DetailPageAdapterForSepetPage: RecyclerView.Adapter<DetailPageViewHolderForSepetPage>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DetailPageViewHolderForSepetPage {
val layoutInflater = LayoutInflater.from(parent?.context)
val customDetailView = layoutInflater.inflate(R.layout.sepet_sayfasi_list_row_detail, parent,false)
return DetailPageViewHolderForSepetPage(customDetailView)
}
override fun onBindViewHolder(holder: DetailPageViewHolderForSepetPage, position: Int) {
var urunDb = sepetArr.get(position)
holder.customView.urun_text.text = urunDb.eklenenUrun
holder.customView.fiyat_text.text = urunDb.eklenenFiyat
holder.customView.adet_text.text = "x" + urunDb.eklenenAdet
var addedCount = urunDb.eklenenAdet.toInt()
// ekleme butonu fonksiyonu
holder.customView.imageButton4.setOnClickListener {
addedCount += 1
holder.customView.adet_text.text = "x$addedCount"
// BURADA COUNT U BİR ARTTIRACAGIZ VE ARKADAN DIGER İKİLİ (URUN VE FIYAT) TUTAN ARRAYE DE EKLEME YAPACAGIZ.. YADA CIKARMASINI ASAGIDA..
var urun = holder.customView.urun_text.text
var fiyat = holder.customView.fiyat_text.text
var adet = holder.customView.adet_text.text
var addedData = SepeteGidenUrunlerModel(
urunEklenen = urun.toString(),
fiyatEklenen = fiyat.toString()
)
var fiyatStr = fiyat.toString()
var droped = fiyatStr.dropLast(2)
var doubleEklenecek = droped.toDouble()
toplamTutar += doubleEklenecek
var tt = toplamTutar.toString()
holder.customView.toplamSayi.setText(tt)
FirstDetailActivity.sepeteEklenenUrunler.add(addedData)
}
// cikarma butonu fonksiyonu
holder.customView.imageButton5.setOnClickListener {
if (addedCount > 1) {
addedCount -= 1
holder.customView.adet_text.text = "x$addedCount"
var urun = holder.customView.urun_text.text
var fiyat = holder.customView.fiyat_text.text
var cikarilan = SepeteGidenUrunlerModel(
urunEklenen = urun.toString(),
fiyatEklenen = fiyat.toString()
)
FirstDetailActivity.sepeteEklenenUrunler.remove(cikarilan)
}else if (addedCount == 1) {
var urun = holder.customView.urun_text.text
var fiyat = holder.customView.fiyat_text.text
var adet = holder.customView.adet_text.text
var cikarilan = SepeteGidenUrunlerModel(
urunEklenen = urun.toString(),
fiyatEklenen = fiyat.toString()
)
FirstDetailActivity.sepeteEklenenUrunler.remove(cikarilan)
var sepetteData = SepetModel(
eklenenUrun = urun.toString(),
eklenenFiyat = fiyat.toString(),
eklenenAdet = adet.toString()
)
sepetArr.removeAt(position)
notifyDataSetChanged()
}
}
}
override fun getItemCount(): Int {
return sepetArr.size
}
}
private class DetailPageViewHolderForSepetPage(val customView: View): RecyclerView.ViewHolder(customView){
}
和XML:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SepetSayfasi">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/sepet_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/toplamText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="24dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sepet_recycler_view" />
<TextView
android:id="@+id/topalmTutar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/toplamText"
app:layout_constraintTop_toTopOf="@+id/toplamText" />
<TextView
android:id="@+id/textToplam"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="@+id/toplamText"
app:layout_constraintTop_toBottomOf="@+id/toplamText" />
<TextView
android:id="@+id/toplamSayi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/textToplam"
app:layout_constraintTop_toTopOf="@+id/textToplam" />
</androidx.constraintlayout.widget.ConstraintLayout>
ViewHolder
中声明RecyclerView
布局的视图,然后可以在onBindViewHolder
private class DetailPageAdapterForSepetPage(
private val activity: <the-class-of-your-activity>,
private val sepetArr: List<the-type-of-your-list>
) : RecyclerView.Adapter<DetailPageViewHolderForSepetPage>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DetailPageViewHolderForSepetPage {
val customDetailView = LayoutInflater.from(parent.context).inflate(R.layout.sepet_sayfasi_list_row_detail, parent, false)
return DetailPageViewHolderForSepetPage(customDetailView)
}
override fun onBindViewHolder(holder: DetailPageViewHolderForSepetPage, position: Int)
{
val urunDb = sepetArr[position]
holder.btn.setOnClickListener {
activity.updateText("Your text")
}
// -- Put the rest of your initializazion code here --
}
override fun getItemCount(): Int = sepetArr.size
inner class DetailPageViewHolderForSepetPage(customView: View): RecyclerView.ViewHolder(customView) {
val btn: Button = customView.findViewById(<your-button-id>)
// -- Put the other views in your recycler view item here --
}
}
在kotlin中,不需要查找id,您可以像这样直接使用holder.itemView.toplamSayi.setText(tt)您可以发布适配器类代码和XML布局吗?我这样做了,但出现了get错误,即尝试在空对象上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”reference@LucaPizzini我现在补充说。我是科特林的新人。如果你看到任何问题,我真的需要建议。separar的类型是什么?我在view holder类中添加了dd行,但它没有解决问题。我也收到了同样的错误。你发布的XML是否参考了
sepet\u sayfasi\u row\u detail
布局?不,我在这里发布了activity\u sepet\u sayfasi.XML,因为我在recycler视图下有文本视图,所以这些文本视图不属于recycler视图确定,你不能访问recycler视图中的toplamSayi
TextView,仅限中的布局,如sayfasi\u列表\u行\u详细信息
。这就是为什么它为您提供了NullPointerException
您可以在父活动中声明一个公共方法来更新按钮,并将父活动作为参数传递给适配器,即在适配器中调用此方法。如果问题符合您的需要,请查看已编辑的问题。
updateText(text: String) {
// Update the text view
}