pinkertem
@pinkertem

Можете объяснить идею, как создать такой макет на android?

641fd73057b59464719453.png

Я пытался сделать такой макет, но зашел в тупик - у меня получилась ужасная луковица, где адаптер вложен в адаптер раза четыре наверное. Это крайне сложно воспринимать, править, и в итоге я не смог довести до конца, потому что в какой-то момент из текущего места уже невозможно пользоваться findViewById и прочие технические вещи. В общем, скорее всего просто подход в целом у меня неправильный.

Можете рассказать (можно без кода, просто концептуально) как правильно делать такие вложенные вещи? Какие лучше использовать классы для каждого элемента и как вообще правильно в таких случаях их связывать. Идея такая:

Серым - это активити в целом
Зеленым - это вкладки
Белым - содержимое вкладки
Оранжевым - набор кнопок, который зависит от выбранной вкладки. Выбираешь другую вкладку - получаешь другой набор кнопок.
Голубым - список элементов. Зависит от того, какая кнопка нажата.

Общая схема работы такая - есть список категорий, подкатегорий и предметов в подкатегории, все это хранится в БД. Вкладки заполняются на основе категорий. Когда пользователь выбрал категорию (нажал вкладку), тянем из БД список подкатегорий и на их основе делаем кнопки. Пользователь выбрал категорию (нажал кнопку) - загружаем из БД список предметов. Пользователь нажал на предмет - открываем новую активити с описанием предмета.
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ответы на вопрос 3
402d
@402d
начинал с бейсика на УКНЦ в 1988
Перечитал вопрос еще раз. Применительно к выводу иеархической структуры каталога я сделал бы через
RecicleView . Два горизонтальных и один вертикальный.
И вместо findViewById советую разобраться с понятием binding
Ответ написан
Комментировать
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
Лучше это реализовать с использованием Jetpack Compose
Ответ написан
kreo_OL
@kreo_OL
Медузко -_-
Вы можете обратить свое внимание на compose
Примерно вот так могла бы выглядить
верстка вашего экрана
@Composable
fun CategoryScreen(categories: List<Category>) {
    val selectedCategory = remember { mutableStateOf(categories[0]) }
    val subcategories = selectedCategory.value.subcategories
    
    Column(Modifier.fillMaxSize()) {
        // Категории
        TabRow(selectedTabIndex = categories.indexOf(selectedCategory.value)) {
            categories.forEachIndexed { index, category ->
                Tab(
                    text = { Text(category.name) },
                    selected = selectedCategory.value == category,
                    onClick = { selectedCategory.value = category }
                )
            }
        }
        
        // Подкатегории
        LazyColumn(Modifier.weight(1f)) {
            items(subcategories.size) { index ->
                val subcategory = subcategories[index]
                Button(
                    modifier = Modifier.fillMaxWidth().padding(16.dp),
                    onClick = { /* Обработка выбора подкатегории */ }
                ) {
                    Text(subcategory.name)
                }
            }
        }
        
        // Предметы
        LazyColumn(Modifier.weight(1f)) {
            val items = subcategories.flatMap { it.items }
            items(items.size) { index ->
                val item = items[index]
                Button(
                    modifier = Modifier.fillMaxWidth().padding(16.dp),
                    onClick = { /* Обработка выбора предмета */ }
                ) {
                    Text(item.name)
                }
            }
        }
        
        // Описание предмета
        Box(Modifier.weight(1f)) {
            Text("Здесь будет описание")
        }
    }
}


Замените данные на ваши. Например можно использовать одну viewModel которая будет связана с бд.

При нажатие на предмет вы можете открывать новый экран или фрагмет при помощи compose navigation.
У этого экрана будет своя viewModel которая умеет работать с бд и получать описание предмета по его ид(или еще по каким то нужным вам признакам.)
При помощи compose navigation вы передадите этому экрану идентификатор предмета и подгрузите его информацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы