Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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 如何从适配器类更改TextView文本?_Android_Kotlin - Fatal编程技术网

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
    }