RecyclerView – NullPointerException en .findViewById

¿Por qué obtengo un error de nullpointereception cuando se invoca bindItems en la class interna ViewHolder de BlogPostAdapter?

He resaltado la línea en la que obtengo un puntero nulo en (ViewHolder -> bindItems) a continuación. El findviewById (r.id.blogpost_author) existe como se puede ver en el XML, entonces, ¿cuál es el problema aquí? ¿Cómo es nulo?

Código del Adaptador / 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 } } 

}

Código de actividad:

 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 } 

}

Clase de datos Kotlin:

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

XML para 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.kotlinlistpptest.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> 

XML para el layout de CardView:

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

Puede estar inflando el layout incorrecto dentro de su RecyclerView.

Esta línea dentro de su método onCreateViewHolder:

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

Está inflando el blog_post_list.xml, que supongo que es el file de layout incorrecto debido al hecho de que también está inflando ese layout dentro de su BlogPostListActivity aquí:

 setContentView(R.layout.blog_post_list) 

Entonces cuando se llama esta línea:

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

Está buscando el id 'blogpost_author' dentro de R.layout.blog_post_list y como puede ver no hay textpost_author TextView dentro de ese layout, por lo que devuelve null.

Para solucionarlo, debe ser sencillo y simplemente cambie el recurso de layout que está asignando a cada ViewHolder en su método onCreateViewHolder con el layout correcto para su layout de CardView.

Lo que significa que la línea debería leer algo como:

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