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

sealed 클래스를 사용한 multiple type 리사이클러뷰 구현시 Footer 문제.

0 추천

동적으로 아이템을 추가하는 리사이클러뷰를 구현중입니다.

미숙하지만 이런 저런 영상과 코드를 보면서 sealed 클래스를 사용한 

multiple type 리사이클러뷰를 구현하려고 하고있습니다.

 

만들던중 고민이 생겼습니다.

사진처럼 버튼을 이용해서 리사이클러뷰의 아이템을 추가하는데 이 버튼은 항상 아이템의 바로 아래 위치합니다.

Footer라고 칭하겠습니다.

즉 아이템이 늘어나면 이 Footer의 위치도 늘어난 아이템의 마지막 바로 아래위치하게되고

줄어들게되어도 줄어든 아이템의 마지막 바로 아래 위치하게 됩니다.

 

그런데 이 Footer를 sealed 클래스를 이용하여 리스트속에 포함시키자니..

제일 마지막에 위치해야하기에 다른 아이템을 추가할때마다 따로 항상 마지막에 Footer 아이템을 따로 추가해줘야할 것 같습니다...

(다른 방법은 생각이 나질 않아요..)

 

아니면 sealed 클래스에 포함시키지 않고 아이템1과 아이템2만 sealed 클래스속에 포함시켜줘야할까요?

다른 코드에도 Footer를 sealed 클래스에 넣는 코드를 한둘 보긴했습니다만..

전부 저처럼 동적으로 아이템을 생성하는 것들이 아니다보니.. 좀 다르네요..

 

 

codeslave (3,940 포인트) 님이 2021년 9월 26일 질문

1개의 답변

0 추천

footer 를 리사이클러뷰에 넣지 마시고 레이아웃의 제일 하단에 footer 를 위치시키셔도 될 것 같은데요.

님의 경우는, 어차피 리사이클러뷰의 높이가 변하기 때문에 고정높이의 리사이클러뷰를 사용할 수 없을 것 같네요.

이 방법이 제일 간단하고 깔끔해 보이네요. 이 경우는 NestedRecyclerView를 사용해야할 것 같은데요.

 

다른 방법으로는, 말씀하신대로 제일 마지막에 Footer를 추가하는 것도 방법은 될 것 같네요.

아니면, ConcatAdapter를 사용하여 footer adapter을 추가하는 방법을 사용해 볼 수 있겠네요.

첫번째 방법을 사용할 때 유틸함수 같은 것을 만들어서 Footer까지 포함된 리스트를 리턴하도록 하시면 아이템 변경과 상관없이 처리할 수 있습니다.

sealed class ListItem {
   data class Body(...): ListItem()
   data class Footer(...): ListItem()
}

val footerItem: ListItem by lazy {
    ListItem.Footer(...)
}

fun getListItems(): List<ListItem> {
   return getBodyItems().plus(footerItem)
}

매번 Footer를 더해주는 대신 함수를 하나 만들어서 해당 함수를 호출하시면 될 것 같은데요.

spark (226,420 포인트) 님이 2021년 9월 26일 답변
spark님이 2021년 9월 26일 수정
사진보고 NestedRecyclerView 사용해야할것같다고 말쓴하시는거죠?
그렇다면 사진은 그냥 찍어놓은게 없어서 앞전사진 가져온것이라서요..
UI를 약간 변경할 예정입니다.. 아마 사진처럼 빨간박스안에 다른 RscyclerView가 들어가능 구조가아니라 하나의 RecyclerView에 다 펼쳐보일거에요.
말씀하신대로 Footer를 하단에 고정하는 방법도 있긴한데 원하는 ui적으로는
아이템밑에븉어있는 형태를 원했어서 고려는 해봐야겠습니다.

처음 사진과같은 디자인을 할때는 RecyclerView가 두개 필요했는데 ConcatAdapter의 경우 하나의 RecyclerView에만 사용이가능해서 사용을못했는데 이제 Recyclerview를 하나만 사용할 예정이라 이것도 고려해봐야겠내요.

그런데 ConcatAdapter를 사용한다하먄 굳이 sealed클래스를 사용할 이유는 없어지죠?
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/routineRcv"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/app_name" />
    </LinearLayout>

</androidx.core.widget.NestedScrollView>

버튼이 항상 리사이클러뷰 바로 아래에 위치하게 됩니다. 처음에 아이템이 없을 때의 버튼위치만 상관없다면 말이죠.
...