마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

메뉴 목록에 대해 질문이 있습니다.

0 추천

안녕하세요 현재 앱 프로그래밍 공부중인 뉴비입니다. 공부중에 한가지 궁금한 점이 생겨 빠른 해결점을 갖고자 여기 질문을 올리게 되었습니다. 고수님들께는 제가 묻는 질문이 하찮거나 귀찮은 수준일수 있겠지만 감내하시고 알려주신다면 정말 대단히 감사하며 많은 도움이 될터이니 간곡히 부탁드립니다.

질문 드리겠습니다.

안드로이드 스튜디오에서 기본 제공하는 네비게이션 드로어블 액티비티(왼쪽에서 서랍형처럼 나오는 메뉴구성화면)에서 메뉴속에 메뉴를 구성하고 싶은데 그것을 구현하기 위한 코딩들이 궁금합니다.

예를들어 1, 2, 3번이라는 메뉴가 있다고 가정 한다면 // 1번 메뉴안에는 다시 1-1, 1-2, 1-3 같은 메뉴가 속해 있고 이것은 1번 메뉴를 클릭하였을시 역시 서랍메뉴처럼 아래로 스르륵 나오는 구조를 말합니다.

아래 사진에 빨간색 동그라미 친 부분과 같이 저것을 눌럿을때 아래 하위메뉴들이 나오는 기능을 구현하고 싶습니다. 고수님들 부탁드립니다.
1

체봉 (250 포인트) 님이 2021년 5월 3일 질문
체봉님이 2021년 5월 3일 수정

1개의 답변

0 추천
 
채택된 답변

RecyclerView를 사용해서 해당 아이템이 클릭되면 Expand 되게 만드세요.

코드를 짜기에는 너무 길 것 같구요. 구글에 Expandable RecyclerView라고 검색하시면 원하시는 검색결과를 찾으실 수 있을 것 같아요. Github에도 라이브러리아 오픈 소스로 된 코드가 많이 있을 겁니다.

기본적인 동작 원리는 리사이클러뷰에 필요한 아이템을 뿌리신 후, 아이템을 클릭했을 때 하위 메뉴가 존재하면  토글을 시키셔서 하위 아이템들을 보여주었다/감췄다 하시면 됩니다. 하위아이템의 상태는 SparseArray나 아이템 자체에 boolean 변수를 두셔서 관리하셔야 하구요.  아이템들의 상태 관리는 가능하면 RecyclerViewAdapter 외부에서 하시도록 하세요. ViewHolder에서는 하지 마시구요.  각 아이템을 아래처럼 자기 참조를 하게끔 구성하시면 되지 않을까 싶네요.

data class NavigationMenuIem(
   @StringRes val textResId: Int,
    val id: Int = textResId,
   val expanded: Boolean = false,
   val subItems: List<NavigationMenuIem> = emptyList()
) {
   @DrawableRes
   val toggleIconResId: Int
       get() = when {
            subItems.isEmpty() -> 0
            expanded ->  R.drawable.ic_chevron_up
            else ->  R.drawable.down
        }
}

val NaviationMenuItems = listOf(
    NavigationMenuIem(textResId = R.string.week),
    NavigationMenuIem(textResId = R.string.day),
    NavigationMenuIem(textResId = R.string.reminder),
    NavigationMenuIem(textResId = R.string.mobile, subItems = listOf(
           NavigationMenuIem(textResId = R.string.my_calendar),
           NavigationMenuIem(textResId = R.string.birthdays),
           NavigationMenuIem(textResId = R.string.holidays),
           NavigationMenuIem(textResId = R.string.public_days),
           NavigationMenuIem(textResId = R.string.my_secure_calendar)
    ),
     NavigationMenuIem(textResId = R.string.events, subItems = listOf(...)
)

 

spark (227,470 포인트) 님이 2021년 5월 3일 답변
체봉님이 2021년 5월 3일 채택됨
답변 감사합니다!
아직 쌩초보라서 검색을 통해 공부해보려 해도 해당 기능에 대해 어떤 단서로 검색을 해야 할지조차 갈피를 잡지 못하고 있던 차에 도움이 정말 많이 되었습니다! 아직 말씀하시는 코드 동작 방향성에 대해 제가 지식이 부족하여 이해를 잘 못하고 있는 상태이지만 위와 같이 주신 답변을 토대로 배우며 이해해 나가겠습니다. 다시한번 감사드립니다!
...