【问题标题】:Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference on recyclerview kotlin尝试在 recyclerview kotlin 上的空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)'
【发布时间】:2020-09-28 16:51:55
【问题描述】:

尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”

所以我只学了 3 周的 kotlin 就卡住了

这是我的 MainActivity.kt

package com.go.personalitieslist

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.ContactsContract
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.widget.Toolbar
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView


class MainActivity : AppCompatActivity() {

    private lateinit var rvPersonalities: RecyclerView
    private var list: ArrayList<Personalities> = arrayListOf()
    private lateinit var  listPersonalitiesAdapter: ListPersonalitiesAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val mtoolbar = findViewById<View>(R.id.toolbar) as Toolbar
        setSupportActionBar(mtoolbar)

        rvPersonalities = findViewById(R.id.rv_personalities)
        rvPersonalities.setHasFixedSize(true)

        list.addAll(PersonalitiesData.listData)
        showRecyclerList()

    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main_menu,menu)
        return super.onCreateOptionsMenu(menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId
        val intent = Intent(this, About::class.java)
        when(id){
            R.id.profile-> startActivity(intent)
        }

        return super.onOptionsItemSelected(item)
    }

    private fun showRecyclerList() {
        rvPersonalities.layoutManager = LinearLayoutManager(this)
        val listPersonalitiesAdapter = ListPersonalitiesAdapter(list)
        rvPersonalities.adapter = listPersonalitiesAdapter
        listPersonalitiesAdapter.setOnItemClickCallback(object : ListPersonalitiesAdapter.OnItemClickCallback {

            override fun onItemClicked(data: Personalities) {

                val detailIntent = Intent(this@MainActivity, DetailPage::class.java).apply {
                    putExtra(DetailPage.EXTRA_NAME,data.name)
                    putExtra(DetailPage.EXTRA_DETAIL,data.detail)
                    putExtra(DetailPage.EXTRA_PHOTO,data.photo)
                }
                showSelectedPersonalities(data)
                startActivity(detailIntent)

            }
        })

    }
    private fun showSelectedPersonalities(personalities: Personalities) {
        Toast.makeText(this, personalities.name, Toast.LENGTH_SHORT).show()
    }

}

这是 ListPersonalitiesAdapter.kt

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.item_row_personalities.view.*


class ListPersonalitiesAdapter(val listPersonalities:ArrayList<Personalities>) : RecyclerView.Adapter<ListPersonalitiesAdapter.ListViewHolder>() {

    private lateinit var onItemClickCallback: OnItemClickCallback


    fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback) {
        this.onItemClickCallback = onItemClickCallback
    }

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ListViewHolder {
        val view: View = LayoutInflater.from(viewGroup.context).inflate(R.layout.item_row_personalities, viewGroup, false)
        return ListViewHolder(view)
    }

    override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
         holder.bind(listPersonalities[position])
         holder.itemView.setOnClickListener(){
             onItemClickCallback.onItemClicked(listPersonalities[holder.adapterPosition])
         }
    }

    /*
    val personalities = listPersonalities[position]
    Glide.with(holder.itemView.context)
    .load(personalities.photo)
    .apply(RequestOptions().override(55, 55))
    .into(holder.imgPhoto)
    holder.tvName.text = personalities.name
    holder.tvDetail.text = personalities.detail
    holder.itemView.setOnClickListener {
        onItemClickCallback.onItemClicked(listPersonalities[holder.adapterPosition])
    }

     */

    override fun getItemCount(): Int {
        return listPersonalities.size
    }

    class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(item : Personalities){
            with(itemView){
                tv_item_name.text = item.name
                tv_item_detail.text = item.detail
                Glide.with(this).load(item.photo).into(img_item_photo)
            }
        }
    }
    //var tvName: TextView = itemView.findViewById(R.id.tv_item_name)
    //        var tvDetail: TextView = itemView.findViewById(R.id.tv_item_detail)
    //        var imgPhoto: ImageView = itemView.findViewById(R.id.img_item_photo)

        interface OnItemClickCallback {
            fun onItemClicked(data: Personalities)
        }
}

这是 DetailPage.kt

class DetailPage : AppCompatActivity(){

    companion object {
        val EXTRA_NAME = "extra_name"
        val EXTRA_DETAIL = "extra_detail"
        val EXTRA_PHOTO = "extra_photo"
    }


    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_detail)

        showDetailPersonalities()

    }


    private fun showDetailPersonalities(){
        tv_item_name.setText(intent.getStringExtra(EXTRA_NAME))
        tv_item_detail.setText(intent.getStringExtra(EXTRA_DETAIL))
        Glide.with(this).load(intent.getIntExtra(EXTRA_PHOTO,0)).into(img_item_photo)
    }

}

这是显示详细信息页面的activity_detail.xml

<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">

    <ScrollView
        android:layout_width="409dp"
        android:layout_height="729dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <de.hdodenhof.circleimageview.CircleImageView
                android:id="@+id/extra_photo"
                android:layout_width="match_parent"
                android:layout_height="422dp"
                android:contentDescription="@string/todo"
                tools:background="@drawable/ic_launcher_background" />

            <TextView
                android:id="@+id/extra_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:layout_marginBottom="15dp"
                android:fontFamily="sans-serif"
                android:textAlignment="center"
                android:textAppearance="@style/TextAppearance.AppCompat.Display1"
                android:textSize="30sp"
                android:textStyle="bold"
                android:typeface="normal" />

            <TextView
                android:id="@+id/extra_detail"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="10dp"
                android:fontFamily="sans-serif"
                android:textAlignment="viewStart"
                android:textSize="18sp" />
        </LinearLayout>
    </ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

这是调试器按摩

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.go.personalitieslist, PID: 14854
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.go.personalitieslist/com.go.personalitieslist.DetailPage}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
        at com.go.personalitieslist.DetailPage.showDetailPersonalities(DetailPage.kt:29)
        at com.go.personalitieslist.DetailPage.onCreate(DetailPage.kt:23)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

【问题讨论】:

  • 我认为您活动中的这一行缺少 import kotlinx.android.synthetic.main.activity_log_in.* activity_log_in = name of xml =>

标签: android listview kotlin android-recyclerview


【解决方案1】:

您在 DetailPage 活动中的 ID 为 tv_item_nametv_item_name 的 TextView 上设置文本,但您的 activity_detail.xml 中没有带有这些 ID 的 TextView。

您想要做的是调用extra_nameextra_detail

private fun showDetailPersonalities(){
    extra_name.setText(intent.getStringExtra(EXTRA_NAME)) //change this
    extra_detail.setText(intent.getStringExtra(EXTRA_DETAIL)) //and this
    Glide.with(this).load(intent.getIntExtra(EXTRA_PHOTO,0)).into(img_item_photo)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多