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) 
  • Kotlin: eliminar nulos de una list (u otra transformación funcional)
  • ¿Cómo se especifican los parameters de tipo para el constructor principal en Kotlin?
  • ¿Cómo simplificar múltiples controles de igual a igual en las condiciones?
  • ¿Qué function de lenguaje en Kotlin puede causar pérdidas de memory?
  • No se puede conseguir que las classs de Kotlin en el proyecto Java maven funcionen (Eclipse)
  • Kotlin: cuando expresión con retorno tipo de function
  • Android Kotlin - Volley Código de respuesta inesperada 400
  • Android - Kotlin - para en medio del process
  • Cómo convertir Long to Int en Kotlin?
  • La propiedad debe inicializarse o ser abstracta
  • ¿Cómo cambio el text del button y la function en Android?