RecyclerView – 在.findViewById上的NullPointerException

为什么当在BlogPostAdapter的内部类ViewHolder上调用bindItems时会出现nullpointerexception错误?

我已经突出显示了我在下面(ViewHolder – > bindItems)中得到一个空指针的行。 findviewById(r.id.blogpost_author)存在,你可以在XML中看到,所以这里有什么问题? 它是如何空?

适配器/ ViewHolder代码:

class BlogPostAdapter(val blogList: ArrayList<BlogPost>) : RecyclerView.Adapter<BlogPostAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : BlogPostAdapter.ViewHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.blog_post_list, parent, false) return ViewHolder(v) // OMITTED VIEWHOLDER } override fun getItemCount(): Int { return blogList.size } override fun onBindViewHolder(holder: BlogPostAdapter.ViewHolder, position: Int) { holder.bindItems(blogList[position]) } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bindItems(blogPost: BlogPost) { val blogPostAuthor = itemView.findViewById<TextView>(R.id.blogpost_author) // THIS LINE - NULL POINTER EXCEPTION val blogPostTitle = itemView.findViewById<TextView>(R.id.blogpost_title) blogPostAuthor.text = blogPost.author blogPostTitle.text = blogPost.title } } 

}

活动代码:

 class BlogPostListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.blog_post_list) // Get the RecyclerView from XML itself val recyclerView = findViewById<RecyclerView>(R.id.recyclerview) // Add a layout manager - What does a layout manager do? recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false) // Create an array list to store blogposts using the the data class blogPost val blogPosts = ArrayList<BlogPost>() // Add some dummy data to the list blogPosts.add(BlogPost(123, "First Blog Post", "John")) blogPosts.add(BlogPost(456, "Second Blog Post", "Bob")) blogPosts.add(BlogPost(789, "Third Blog Post", "Mary")) // Create an adapter val adapter = BlogPostAdapter(blogPosts) // Add the adapter to the recyclerview recyclerView.adapter = adapter } 

}

Kotlin数据类:

 data class BlogPost(val id: Int, val title: String, val author: String) 

XML for Recyclerview:

 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.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="com.topzap.android.kotlinlistapptest.BlogPostListActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout_editor_absoluteX="8dp" tools:layout_editor_absoluteY="8dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> </android.support.constraint.ConstraintLayout> 

用于CardView布局的XML:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/blogpost_author" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:text="AuthorPlaceHolder" android:textAppearance="@style/Base.TextAppearance.AppCompat.Large" /> <TextView android:id="@+id/blogpost_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:text="TitlePlaceHolder" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" /> </LinearLayout> </android.support.v7.widget.CardView> </LinearLayout> 

您可能会在RecyclerView中夸大错误的布局。

你的onCreateViewHolder方法中的这一行:

 val v = LayoutInflater.from(parent.context).inflate(R.layout.blog_post_list, parent, false) 

你正在膨胀的blog_post_list.xml,我假设是错误的布局文件,因为你也在这里扩大你的BlogPostListActivity布局:

 setContentView(R.layout.blog_post_list) 

所以当这行被称为:

 val blogPostAuthor = itemView.findViewById<TextView>(R.id.blogpost_author) 

它正在R.layout.blog_post_list中寻找id'blogpost_author',正如你所看到的,在这个布局中没有blogpost_author TextView,所以它返回null。

要对它进行排序,它应该是直接的,只需更改您的onCreateViewHolder方法中指定给每个ViewHolder的布局资源,并使用CardView布局的正确布局。

这意味着该行应该读取如下内容:

 val v = LayoutInflater.from(parent.context).inflate(R.layout.your_card_layout, parent, false)