RecyclerView остаётся пустым после возврата из фрагмента
У меня загружается список книг в recyclerview в mainactivity. При нажатии открывается фрагмент с информацией о книге. При этом список должен стать невидимым. Но когда нажимаешь "назад", выходя из фрагмента, список книг пуст.
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var recyclerView: RecyclerView
private lateinit var bookAdapter: BookAdapter
private var books: List<Book> = emptyList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
recyclerView = binding.recyclerView
recyclerView.layoutManager = LinearLayoutManager(this)
// Инициализация адаптера с пустым списком
bookAdapter = BookAdapter(books) { book ->
openBookDetailFragment(book)
}
recyclerView.adapter = bookAdapter
// Загружаем книги
loadPopularBooks()
}
override fun onResume() {
super.onResume()
// Восстанавливаем видимость RecyclerView, если он скрыт
if (binding.recyclerView.visibility == View.GONE) {
binding.recyclerView.visibility = View.VISIBLE
Log.d("MainActivity", "RecyclerView восстановлен в onResume")
}
}
override fun onBackPressed() {
super.onBackPressed()
Log.d("MainActivity", "onBackPressed: Нажата кнопка назад")
if (supportFragmentManager.backStackEntryCount == 0) {
Log.d("MainActivity", "Возвращаемся на главный экран, показываем RecyclerView")
binding.recyclerView.visibility = View.VISIBLE
if (books.isNotEmpty()) {
bookAdapter.notifyDataSetChanged()
Log.d("MainActivity", "Адаптер обновлен")
}
}
}
private fun openBookDetailFragment(book: Book) {
// Логируем процесс открытия фрагмента
Log.d("MainActivity", "Открытие фрагмента: Скрытие RecyclerView")
binding.recyclerView.visibility = View.GONE
val fragment = DetailBookFragment.newInstance(book)
if (supportFragmentManager.findFragmentByTag(fragment::class.java.simpleName) == null) {
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.fragment_container, fragment, fragment::class.java.simpleName)
.addToBackStack(null) // Добавляем в стек
.commit()
Log.d("MainActivity", "Фрагмент добавлен в транзакцию")
} else {
Log.d("MainActivity", "Фрагмент уже существует, не заменяем")
}
}
private fun loadPopularBooks() {
lifecycleScope.launch {
try {
books = getRussianBooks()
Log.d("MainActivity", "Книги загружены: $books")
if (books.isNotEmpty()) {
bookAdapter = BookAdapter(books) { book ->
openBookDetailFragment(book)
}
recyclerView.adapter = bookAdapter
binding.recyclerView.visibility = View.VISIBLE
Log.d("MainActivity", "RecyclerView показан")
} else {
Toast.makeText(this@MainActivity, "Нет данных для отображения", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
Toast.makeText(this@MainActivity, "Ошибка при загрузке данных", Toast.LENGTH_SHORT).show()
Log.e("MainActivity", "Ошибка при загрузке данных", e)
}
}
}
}
Ответы (1 шт):
Автор решения: snejok
→ Ссылка
что если сделать фрагмент с информацией о книге на весь экран, чтоб не скрывать список?
либо попробовать реализовать сохранение списка onSaveInstanceState()
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelableArrayList("books", ArrayList(books))
Log.d("MainActivity", "Список книг сохранен в onSaveInstanceState")
}