Intereting Posts
Single.defer () не выполнен Как синтетически добавить активность в задний стек перед началом другого? Доступ к R.drawable в Android Studio вызывает исключение KotlinFrontEndException SugarORM + Kotlin: Неопубликованная ссылка "listAll" Как правильно сериализовать такой JSON с помощью GSON Android? Вставить код из метода в новый класс Могу ли я использовать сторонние java-библиотеки (.jar) для разработки Android с Kotlin? неразрешенная ссылка: текст – Android Studio + Kotlin (findViewById fault?) Почему я получаю сообщение об ошибке «Смарт-бросок в« Лонг »невозможно» в Котлине? Но это нормально в java? Как извлечь карту из коллекции объектов, с ключом как одним из объектов того же поля и значением фактических объектов Android Kotlin: файл BuildConfig не дает правильного значения Доступ к свойствам задачи в градле Котлин Как получить доступ к переменной экземпляра в статическом сопутствующем объекте в Koltin Дженерики для RecyclerView.Adapter Android Нежелательные выборы в RecyclerView

kotlin андроид фрагмент пустой recycler вид после назад

У меня есть этот фрагмент андроида:

class MainFragment: BaseFragment(){ private val recyclerView by lazy { find<RecyclerView>(R.id.recyclerView) } private val fab by lazy { find<FloatingActionButton>(R.id.fab) } private val myLayoutManager by lazy { LinearLayoutManager(ctx, LinearLayoutManager.VERTICAL, false) } private val myAdapter by lazy { MainCardAdapter(ctx, ArrayList<MainCardAdapterItem>(), R.layout.card_main_item) } override val fragmentLayout = R.layout.fragment_main_layout val DUMMY_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing" ) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = super.onCreateView(inflater, container, savedInstanceState) setHasOptionsMenu(true) return view } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { Log.i("TAG", "onViewCreated") super.onViewCreated(view, savedInstanceState) (act as MainActivity).run { showWidgetStars(true) } recyclerView .linkToLayoutManager(myLayoutManager) .linkToAdapter(myAdapter) .addItemDecorator(removedSwipeLeftDecorator) .setOnItemChangedDuration(500) myAdapter.run { setAdapterItems(dummyList) } } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.activity_main_context, menu) menu.findItem(R.id.action_secundary_menu).run { isVisible = true icon.setTintCompat(ctx, act.colorFromRes(R.color.appGreyDark)) } super.onCreateOptionsMenu(menu, inflater) } override fun onOptionsItemSelected(item: MenuItem): Boolean { when(item.itemId){ R.id.action_secundary_menu -> { act.showSnackBar("Clicked Secondary Menu!") return true } else -> return super.onOptionsItemSelected(item) } } } 

Все работает хорошо, кроме как после того, как я вернусь к этому фрагменту (заменен в менеджере фрагментов другим, добавленным в backstack). Когда я вернусь, я получаю сообщение об ошибке: E/RecyclerView: No adapter attached; skipping layout E/RecyclerView: No adapter attached; skipping layout . Моя ставка заключается в том, что это связано с ленивыми свойствами, но я не могу понять, почему. Фрагмент показывает хороший результат при первом запуске, только при возвращении он не показывает элементы просмотра повторного использования и отображает это сообщение

Так как мои свойства объявлены lazy { find<View>(R.id.xxx} которые в основном означают, что они будут только накачаны из макета один раз. Если представление фрагмента каким-то образом необходимо создать снова, свойство recyclerview будет указывать к старому виду.

Я не уверен, как исключение null-указателя в этом случае не было выбрано. Просто измените ленивый на var и onCreateView его на onCreateView . Другое дело, если мы хотим использовать тот же LayoutManager для нового завышенного recyclerview, мы должны очистить его от предыдущего recyclerview recyclerView.layoutManager = null , в противном случае будет layoutManager исключение, говорящее, что layoutManager уже layoutManager к другому recyclerView.