RecyclerView – исключение NullPointerException для .findViewById

Почему я получаю ошибку nullpointerexception, когда bindItems вызывается во внутреннем классе ViewHolder BlogPostAdapter?

Я выделил строку, в которой я получаю нулевой указатель в (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 } 

}

Класс данных Котлина:

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

XML для 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> 

XML для макета 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> 

Возможно, вы повредите неправильный макет в своем 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) 

Он ищет идентификатор «blogpost_author» в R.layout.blog_post_list, и, как вы видите, в этом макете нет текстового блока blogpost_author, поэтому он возвращает null.

Чтобы разобраться в этом, он должен быть прямым и просто изменить ресурс макета, который вы назначаете каждому ViewHolder в вашем методе onCreateViewHolder, с правильной компоновкой для вашего макета CardView.

Это означает, что строка должна читать что-то вроде:

 val v = LayoutInflater.from(parent.context).inflate(R.layout.your_card_layout, parent, false) 
Intereting Posts
Как получить доступ к переменной экземпляра в статическом сопутствующем объекте в Koltin Приложение Kotlin cli не работает после обновления к kotlin 1.0.0-beta kapt Сбой сборки с процессором Android Dagger лучший способ проверить null в kotlin? Переключение контекста kotlin coroutine при тестировании Android-презентатора Kotlin – создание изменяемого списка с повторяющимися элементами Kotlin автоматически завершает переопределения в Android Studio GSON бросает Ожидаемый BEGIN_OBJECT, но BEGIN_ARRAY В чем разница между плюсом и плюсом при перегрузке оператора котлин? модификатор lateinit не допускается на свойства примитивного типа в Котлине Несоответствие дженериков Котлина в иерархии классов Как использовать настраиваемый сеттер в корпусе конструктора класса Kotlin Настройка Kotlin при выражении Программно изменять ориентацию меню кланов Как использовать `filter` на экземпляре карты в Kotlin?