Intereting Posts
Расширенное назначение и приращение не поддерживаются для локальных делегированных свойств и встроенных свойств Android Anko с пользовательской ошибкой просмотра (Kotlin) Как я могу создать «forEach», который возвращает объект, который является приемником для функции потребления? Как добавить новую конфигурацию с помощью Gradle Script Kotlin? Как использовать аннотацию Swagger @ApiResponses в Котлине? Кажется, это ошибка в библиотеке поддержки дизайна RxJava zipWith Ошибка IDE в Kotlin с использованием Android Studio 3.0 Android Kotlin StringRes quantityString Статический блок инициализации в Котлине В Kotlin, как вы можете ограничить выбор в свободно Builder для разных видов настроек Переименование каталога «java» в «kotlin» в Android Studio Как скрыть поле для латинировки var Kitlin с помощью Java? Kotlin с Spring DI: свойство lateinit не было инициализировано Gradle kotlin-spring плагин не открывает весенние классы Kotlin: преобразовать большой список в подсписку заданного размера раздела

Установить LayoutManager на фрагменте

Я создал фрагмент, где я пытаюсь реализовать recyclerView и загрузить список. Проблема возникает, когда я пытаюсь установить layoutManager

Ошибка:

java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.support.v7.widget.RecyclerView.setLayoutManager (android.support.v7.widget.RecyclerView $ LayoutManager)' на ссылку нулевого объекта в com.gn.app. Fragments.StationsFragment.onCreateView (StationsFragment.kt: 37)

Я не могу понять, что случилось.

Фрагмент:

class StationsFragment : Fragment() { companion object { val TAG: String = StationsFragment::class.java.simpleName fun newInstance() = StationsFragment() } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { activity.title = getString(R.string.title_home) val view = inflater?.inflate(R.layout.fragment_stations, container, false) rcViewStations.layoutManager = LinearLayoutManager(activity) val retrofit = Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build() val stations = retrofit.create(StationService::class.java) val call = stations.getStations() call.enqueue(object : Callback<ResponseStations> { override fun onResponse(call: Call<ResponseStations>?, response: Response<ResponseStations>?) { if (response?.code() == 200) { loadData(response.body()?.stations) } } override fun onFailure(call: Call<ResponseStations>?, t: Throwable?) { //TODO: Implement error response. } }) return view } private fun loadData(stations: List<StationsItem?>?) { val items = stations?.map { it?.let { Station(name, long, lat) } } rcViewStations.adapter = AdapterStation(items) } } 

Utils

 fun ViewGroup.inflate(layoutId: Int): View { return LayoutInflater.from(context).inflate(layoutId, this, false) } 

Фрагмент xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:app="http://schemas.android.com/apk/res-auto" tools:context="com.gn.app.Fragments.StationsFragment"> <android.support.v7.widget.RecyclerView android:id="@+id/rcViewStations" android:layout_width="match_parent" android:layout_height="wrap_content" app:behavior_overlapTop="30dp" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </FrameLayout> 

item xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp"> <TextView android:id="@+id/txtStationName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:transitionName="transitionTitle" tools:text="Name" /> <TextView android:id="@+id/txtStationDistance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Small" android:transitionName="transitionDesc" tools:text="0.00 m" /> <TextView android:id="@+id/txtStationBikes" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Small" android:transitionName="transitionDesc" tools:text="12" /> <TextView android:id="@+id/txtStationSlots" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Small" android:transitionName="transitionDesc" tools:text="22" /> <TextView android:id="@+id/txtStationDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textColor="@color/colorAccent" android:transitionName="transitionPrice" tools:text="Date" /> </LinearLayout> </android.support.v7.widget.CardView> 

rcViewStations является нулевым, как говорят Исключения. Похоже, вы используете расширения kotlin android, которые используют getView() внутри. getView () может возвращать значение только после завершения обработки.

Вы можете либо использовать всю логику управления onViewCreated в onViewCreated либо получить доступ к RecyclerView с помощью findViewById в новом созданном представлении от inflater?.inflate(R.layout.fragment_stations, container, false)

Я исправил проблему установки макета внутри этого onActivityCreated что имеет смысл, потому что представление не создано.

поэтому класс выглядит следующим образом:

 class StationsFragment : Fragment() { companion object { val TAG: String = StationsFragment::class.java.simpleName fun newInstance() = StationsFragment() } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { activity.title = getString(R.string.title_home) val view = inflater?.inflate(R.layout.fragment_stations, container, false) return view } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) rcViewStations.layoutManager = LinearLayoutManager(activity) val retrofit = Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build() val stations = retrofit.create(StationService::class.java) val call = stations.getStations() call.enqueue(object : Callback<ResponseStations> { override fun onResponse(call: Call<ResponseStations>?, response: Response<ResponseStations>?) { if (response?.code() == 200) { loadData(response.body()?.stations) } } override fun onFailure(call: Call<ResponseStations>?, t: Throwable?) { //TODO: Implement error response. } }) } private fun loadData(stations: List<StationsItem?>?) { val items = stations?.map { it?.let { Station(name, long, lat) } } rcViewStations.adapter = AdapterStation(items) } }