Проблема с адаптером RecyclerView в приложении Android ⇐ Android
-
Anonymous
Проблема с адаптером RecyclerView в приложении Android
В моем приложении для Android возникла проблема, связанная с RecyclerView и его адаптером. Я получаю сообщение об ошибке: «Адаптер не подключен; пропуск макета». Я тщательно проверил свой код и файлы макета XML, но не смог решить проблему. 2023-12-31 12:56:26.403 E/RecyclerView: адаптер не подключен; пропуск макета
Макет XML (соответствующая часть):
Описание проблемы:
RecyclerView в моем приложении Android настроен в макете XML с соответствующими атрибутами, включая LayoutManager, для которого установлено значение LinearLayoutManager. Во время выполнения приложение выдает ошибку «Адаптер не подключен; пропуск макета», указывая на то, что RecyclerView неправильно подключен к адаптеру.
Код Kotlin (GalleryFragment.kt):
пакет com.example.miauto.ui.gallery импортировать автомобиль импортировать android.os.Build импортировать android.os.Bundle импортировать android.view.LayoutInflater импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.AdapterView импортировать android.widget.ArrayAdapter импортировать android.widget.Button импортировать android.widget.EditText импортировать android.widget.Spinner импортировать androidx.annotation.RequiresApi импортировать androidx.fragment.app.Fragment импортировать androidx.recyclerview.widget.LinearLayoutManager импортировать androidx.recyclerview.widget.RecyclerView импортировать com.example.AppDatabaseVehicle импортировать com.example.AppDatabaseCarga импортировать com.example.CargaAdapter импортировать com.example.CargaCombustible импортировать com.example.miauto.databinding.FragmentGalleryBinding импортировать kotlinx.coroutines.Dispatchers импортировать kotlinx.coroutines.GlobalScope импортировать kotlinx.coroutines.launch импортировать kotlinx.coroutines.withContext импортировать java.time.LocalDate импортировать java.time.ZoneId класс GalleryFragment : Fragment() { частный вар выбран. Транспортное средство: Транспортное средство? = ноль частный lateinit var appDatabase: AppDatabaseVehicle частный lateinit var appDatabaseCarga: AppDatabaseCarga частный var _binding: FragmentGalleryBinding? = ноль частный lateinit var CargaRecyclerView: RecyclerView частная привязка val get() = _binding!! частный lateinit var spinnerAdapter: ArrayAdapter частные вар транспортные средства = mutableListOf() @RequiresApi(Build.VERSION_CODES.O) переопределить удовольствие onCreateView( инфлятор: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentGalleryBinding.inflate(инфлятор, контейнер, ложь) корень val: View =binding.root val spinnerVehicles: Spinner =binding.spinnerVehicles val editTextLitros: EditText =binding.editTextLitros val editTextPrecio: EditText =binding.editTextPrecio val spinnerTipoCombustible: Spinner =binding.spinnerTipoCombustible val btnGenerarAccion: Кнопка = привязка.btnGenerarAccion // Инициализация базы данных помещений appDatabase = AppDatabaseVehicle.getInstance(requireContext()) appDatabaseCarga = AppDatabaseCarga.getInstance(requireContext()) CargaRecyclerView = привязка.recyclerView val layoutManager = LinearLayoutManager(requireContext()) CargaRecyclerView.layoutManager = менеджер макета // Инициализация адаптера Spinner spinnerAdapter = ArrayAdapter( требуетсяКонтекст(), android.R.layout.simple_spinner_item, изменяемыйСписок() ).применять { setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) } spinnerVehicles.adapter = spinnerAdapter selectedVehicle = if (spinnerVehicles.selectedItemPosition!= AdaptorView.INVALID_POSITION) { транспортные средства [spinnerVehicles.selectedItemPosition] } еще { нулевой } // Настройка адаптера RecyclerView GlobalScope.launch(Dispatchers.IO) { val listaDeCargas = selectedVehicle?.id?.let { appDatabaseCarga.cargaCombustibleDao().obtenerCargasPorVehiculo( it.toLong() ) } withContext(Dispatchers.Main) { val cargaAdapter = if (listaDeCargas != null && listaDeCargas.isNotEmpty() && selectedVehicle != null) { LoadAdapter(requireContext(), LoadList, selectedVehicle!!) } еще { selectedVehicle?.let { LoadAdapter(requireContext(), пустойList(), it) } } LoadRecyclerView.adapter = загрузочный адаптер } } // Обработка логики при нажатии кнопки «Создать действие» btnGenerateAction.setOnClickListener { vallitersInput: String = editTextLitros.text.toString() val ценаInput: String = editTextPrice.text.toString() val FuelType: String = spinnerFuelType.selectedItem.toString() // Проверяем, что поля не пусты if (litersInput.isNotEmpty() && PriceInput.isNotEmpty() &&litersInput.isNumeric()) { // Получаем выбранное транспортное средство из Spinner // Получаем литры топлива val литров: Double =litersInput.toDouble() Валовая цена: Double = PriceInput.toDouble() // Создаем объект FuelLoad с захваченными данными val FuelLoad = FuelLoad( идентификатор транспортного средства = 0, литры = литры, цена = цена, ТипТипа = ТипТипа, дата = getCurrentDate(), пробег = выбранное транспортное средство?.пробег ) // Сохраняем запас топлива в комнате saveFuelLoadToRoom(FuelLoad) } } // Загружаем транспорт из комнаты загрузитьТранспортИзКомнаты() вернуть корень } частное развлечение loadVehiclesFromRoom() { // Очищаем список местных транспортных средств транспортные средства.очистить() // Получаем транспортные средства из комнаты в фоновом потоке GlobalScope.launch(Dispatchers.IO) { val VehicleEntities = appDatabase.vehicleDao().getVehicles() // Преобразуем VehicleEntity в Vehicle и добавляем в список for (объект в транспортном средствеEntities) { val Vehicle = Vehicle(entity.id,entity.brand,entity.type,entity.model,entity.kilometers) транспортные средства.add(транспортное средство) } // Уведомляем адаптер об изменении данных (в основном потоке) запуск(Dispatchers.Main) { spinnerAdapter.clear() spinnerAdapter.addAll(vehicles.map { "${it.brand} ${it.model}" }) spinnerAdapter.notifyDataSetChanged() } } } личное развлечение saveFuelLoadToRoom(FuelLoad: FuelLoad) { GlobalScope.launch(Dispatchers.IO) { // В вашем коде вам нужно сгенерировать следующий идентификатор val LastId: Длинный? = appDatabaseLoad.loadFuelDao().getLastLoadId() // Следующим идентификатором будет последний идентификатор + 1 или 1, если предыдущих записей нет val newId: Long = (lastId ?: 0) + 1 Fuelload.loadid = новыйID appDatabaseLoad.loadFuelDamage().insertLoad(loadFuel) println (загрузка топлива) } } // Функция расширения для проверки того, является ли строка числовой частное развлечение String.isNumeric(): Boolean { вернуть попытку { это.toDouble() истинный } catch (e: NumberFormatException) { ЛОЖЬ } } // Определите свою логику для получения текущей даты @RequiresApi(Build.VERSION_CODES.O) личное развлечение getCurrentDate(): Long { val localDate = LocalDate.now() val Instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant() вернуть Instant.toEpochMilli() } переопределить удовольствие onDestroyView() { супер.onDestroyView() _binding = ноль } } Запрос на помощь: Буду признателен за любые рекомендации по решению этой проблемы. Ожидается, что RecyclerView отобразит список элементов, и я подозреваю, что при обновлении и подключении адаптера может возникнуть ошибка. Любые идеи и предложения будут чрезвычайно полезны.
В моем приложении для Android возникла проблема, связанная с RecyclerView и его адаптером. Я получаю сообщение об ошибке: «Адаптер не подключен; пропуск макета». Я тщательно проверил свой код и файлы макета XML, но не смог решить проблему. 2023-12-31 12:56:26.403 E/RecyclerView: адаптер не подключен; пропуск макета
Макет XML (соответствующая часть):
Описание проблемы:
RecyclerView в моем приложении Android настроен в макете XML с соответствующими атрибутами, включая LayoutManager, для которого установлено значение LinearLayoutManager. Во время выполнения приложение выдает ошибку «Адаптер не подключен; пропуск макета», указывая на то, что RecyclerView неправильно подключен к адаптеру.
Код Kotlin (GalleryFragment.kt):
пакет com.example.miauto.ui.gallery импортировать автомобиль импортировать android.os.Build импортировать android.os.Bundle импортировать android.view.LayoutInflater импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.AdapterView импортировать android.widget.ArrayAdapter импортировать android.widget.Button импортировать android.widget.EditText импортировать android.widget.Spinner импортировать androidx.annotation.RequiresApi импортировать androidx.fragment.app.Fragment импортировать androidx.recyclerview.widget.LinearLayoutManager импортировать androidx.recyclerview.widget.RecyclerView импортировать com.example.AppDatabaseVehicle импортировать com.example.AppDatabaseCarga импортировать com.example.CargaAdapter импортировать com.example.CargaCombustible импортировать com.example.miauto.databinding.FragmentGalleryBinding импортировать kotlinx.coroutines.Dispatchers импортировать kotlinx.coroutines.GlobalScope импортировать kotlinx.coroutines.launch импортировать kotlinx.coroutines.withContext импортировать java.time.LocalDate импортировать java.time.ZoneId класс GalleryFragment : Fragment() { частный вар выбран. Транспортное средство: Транспортное средство? = ноль частный lateinit var appDatabase: AppDatabaseVehicle частный lateinit var appDatabaseCarga: AppDatabaseCarga частный var _binding: FragmentGalleryBinding? = ноль частный lateinit var CargaRecyclerView: RecyclerView частная привязка val get() = _binding!! частный lateinit var spinnerAdapter: ArrayAdapter частные вар транспортные средства = mutableListOf() @RequiresApi(Build.VERSION_CODES.O) переопределить удовольствие onCreateView( инфлятор: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentGalleryBinding.inflate(инфлятор, контейнер, ложь) корень val: View =binding.root val spinnerVehicles: Spinner =binding.spinnerVehicles val editTextLitros: EditText =binding.editTextLitros val editTextPrecio: EditText =binding.editTextPrecio val spinnerTipoCombustible: Spinner =binding.spinnerTipoCombustible val btnGenerarAccion: Кнопка = привязка.btnGenerarAccion // Инициализация базы данных помещений appDatabase = AppDatabaseVehicle.getInstance(requireContext()) appDatabaseCarga = AppDatabaseCarga.getInstance(requireContext()) CargaRecyclerView = привязка.recyclerView val layoutManager = LinearLayoutManager(requireContext()) CargaRecyclerView.layoutManager = менеджер макета // Инициализация адаптера Spinner spinnerAdapter = ArrayAdapter( требуетсяКонтекст(), android.R.layout.simple_spinner_item, изменяемыйСписок() ).применять { setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) } spinnerVehicles.adapter = spinnerAdapter selectedVehicle = if (spinnerVehicles.selectedItemPosition!= AdaptorView.INVALID_POSITION) { транспортные средства [spinnerVehicles.selectedItemPosition] } еще { нулевой } // Настройка адаптера RecyclerView GlobalScope.launch(Dispatchers.IO) { val listaDeCargas = selectedVehicle?.id?.let { appDatabaseCarga.cargaCombustibleDao().obtenerCargasPorVehiculo( it.toLong() ) } withContext(Dispatchers.Main) { val cargaAdapter = if (listaDeCargas != null && listaDeCargas.isNotEmpty() && selectedVehicle != null) { LoadAdapter(requireContext(), LoadList, selectedVehicle!!) } еще { selectedVehicle?.let { LoadAdapter(requireContext(), пустойList(), it) } } LoadRecyclerView.adapter = загрузочный адаптер } } // Обработка логики при нажатии кнопки «Создать действие» btnGenerateAction.setOnClickListener { vallitersInput: String = editTextLitros.text.toString() val ценаInput: String = editTextPrice.text.toString() val FuelType: String = spinnerFuelType.selectedItem.toString() // Проверяем, что поля не пусты if (litersInput.isNotEmpty() && PriceInput.isNotEmpty() &&litersInput.isNumeric()) { // Получаем выбранное транспортное средство из Spinner // Получаем литры топлива val литров: Double =litersInput.toDouble() Валовая цена: Double = PriceInput.toDouble() // Создаем объект FuelLoad с захваченными данными val FuelLoad = FuelLoad( идентификатор транспортного средства = 0, литры = литры, цена = цена, ТипТипа = ТипТипа, дата = getCurrentDate(), пробег = выбранное транспортное средство?.пробег ) // Сохраняем запас топлива в комнате saveFuelLoadToRoom(FuelLoad) } } // Загружаем транспорт из комнаты загрузитьТранспортИзКомнаты() вернуть корень } частное развлечение loadVehiclesFromRoom() { // Очищаем список местных транспортных средств транспортные средства.очистить() // Получаем транспортные средства из комнаты в фоновом потоке GlobalScope.launch(Dispatchers.IO) { val VehicleEntities = appDatabase.vehicleDao().getVehicles() // Преобразуем VehicleEntity в Vehicle и добавляем в список for (объект в транспортном средствеEntities) { val Vehicle = Vehicle(entity.id,entity.brand,entity.type,entity.model,entity.kilometers) транспортные средства.add(транспортное средство) } // Уведомляем адаптер об изменении данных (в основном потоке) запуск(Dispatchers.Main) { spinnerAdapter.clear() spinnerAdapter.addAll(vehicles.map { "${it.brand} ${it.model}" }) spinnerAdapter.notifyDataSetChanged() } } } личное развлечение saveFuelLoadToRoom(FuelLoad: FuelLoad) { GlobalScope.launch(Dispatchers.IO) { // В вашем коде вам нужно сгенерировать следующий идентификатор val LastId: Длинный? = appDatabaseLoad.loadFuelDao().getLastLoadId() // Следующим идентификатором будет последний идентификатор + 1 или 1, если предыдущих записей нет val newId: Long = (lastId ?: 0) + 1 Fuelload.loadid = новыйID appDatabaseLoad.loadFuelDamage().insertLoad(loadFuel) println (загрузка топлива) } } // Функция расширения для проверки того, является ли строка числовой частное развлечение String.isNumeric(): Boolean { вернуть попытку { это.toDouble() истинный } catch (e: NumberFormatException) { ЛОЖЬ } } // Определите свою логику для получения текущей даты @RequiresApi(Build.VERSION_CODES.O) личное развлечение getCurrentDate(): Long { val localDate = LocalDate.now() val Instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant() вернуть Instant.toEpochMilli() } переопределить удовольствие onDestroyView() { супер.onDestroyView() _binding = ноль } } Запрос на помощь: Буду признателен за любые рекомендации по решению этой проблемы. Ожидается, что RecyclerView отобразит список элементов, и я подозреваю, что при обновлении и подключении адаптера может возникнуть ошибка. Любые идеи и предложения будут чрезвычайно полезны.
Мобильная версия