에킹텀
28
2021-01-16 15:50:07 작성 2021-01-16 17:03:34 수정됨
4
272

안드로이드 리사이클러뷰 or 리스트뷰를 expandable로 만들어서 검색창까지 달고 싶습니다.


안녕하세요. 안드로이드 쌩초보 대학생입니다.


현재 만들고 싶은 것이

이미지뷰 하나와 여러 텍스트뷰가 속해있는 뷰 하나를

리사이클러뷰나 커스텀 리스트뷰로 표현하는데,


1. expandable로 하여 그룹 리스트, 자식 리스트 두 가지를 두고 싶습니다.

그룹들의 리스트가 있고 하나의 그룹 안에는 자식 리스트가 있는 것입니다.

그룹을 터치하면 자식 리스트가 보이게 펼쳐지고, 다시 접히기도 하는 기능을 원합니다.


2. 이 expandable 리스트뷰 상단에 editText뷰를 달아서 자식 기준으로 검색이 되게 하고 싶습니다.

단, 그룹과 함께 뜨게 하고 싶으며, 그 그룹 내의 검색된 자식만 보여야 합니다.


예를 들어 아래와 같은 리스트가 있습니다. (펼쳐진 상태)


그룹1

- 홍길동

- 김수현

- 고민시

그룹2

- 이준수

- 김지원


여기서 '김'이라고 editText에 입력하면 아래와 같이 뜨게 하고 싶은 것입니다.

그룹 1

- 김수현

그룹2

- 김지원


서치를 해보았을 때 expandable 기능과 리스트에 대하여 검색할 수 있게 하는 기능 두 가지 모두 리스트뷰나 리사이클러뷰 모두 예시가 잘 나오더군요

하지만 이렇게 두 가지 기능을 함께 사용하는 예시는 찾지 못했습니다.


그래서 스스로 두 가지 케이스를 응용해서 구현해보려고 시도했으나 실패했습니다..

시도한 방법은

1. ExpandableListView를 이용하여 그룹-자식 리스트 형식을 먼저 구현했으며

https://twinw.tistory.com/32 <- 참고해서 그대로 작성했습니다. )

2. 어댑터에 필터링 기능을 넣는 방식으로 검색 기능을 구현하려고 했습니다.

performFiltering 메소드를 그룹-자식 리스트 형식에 맞게 수정했습니다.

https://recipes4dev.tistory.com/96 <- 참고해서 응용 부분 제외 그대로 작성했습니다. )


자식들 중에 속한 글자가 입력되면 바로 오류가 뜨더군요 ㅠㅠ


일단 제가 시도한 방법이 맞는 방향인지, 더 나은 방향이 있을지를 먼저 여쭈어 보고 싶어서 자세한 코드는 생략하겠습니다!

혹시 이대로 하는 것이 맞고, 코드를 봐야 조언이 가능하신 것이라면 올리도록 하겠습니다.

이러한 질문 글이 처음이고 서투른 점 양해 부탁드립니다..! 혹시 더 필요한 정보가 있다면 꼭 말씀해주세요.

고수님들 조언 부탁드립니다!

0
  • 답변 4

  • Willee21
    119
    2021-01-16 17:09:04 작성 2021-01-16 17:11:07 수정됨

    전공자와 비전공자의 차이는 아닌 듯 보입니다.

    이런 류의 뷰를 많이 만들어 본 사람이 최고이죠.

    제가 구현을 한다면, 이렇게 구성합니다.

    AdapterGroup - item_adapter_group.xml

    RecyclerGroup 

    AdapterActor - item_adapter_actor.xml

    RecyclerActor

    즉 리사이클러 뷰를 두개를 정의합니다.

    item_adapter_group 안에 RecyclerActor가 정의되어야 하겠죠?

    AdapterGroup 에 전체 데이터를 전달합니다.

    구조는 말씀하신 아래 구조입니다.

    class Root {

       List<Group> groups;

       class Group {

           String name;

           List<String> actor;

       }


    Root root 로 정의하죠. 편의상,

    root가 AdapterGroup의 생성자로 넘어갈때 (이때 검색어도 넘겨줍니다)

    groups.name 만 가져와서 검색어가 있다면, 검색어에 해당하는 아이템이 아닌 것은 array에서 삭제합니다.

    List를 만들어 해당 리스트로 화면을 구성합니다.

    만약에 groups에 item이 하나도 없으면 안보여주겠다고 한다면,

    리스트를 구성할 때 빼면 됩니다.


    그래서 리스트를 구성해서

    onBindViewHolder에서

    RecyclerGourp을 그리면서

    하단 RecylerActor의 AdapterActor에 List<String> actors 값만 넘겨줍니다.

    구조는 간단하게 했지만, name 말고, cover 사진이나, 다른 정보들이 있다면, Actor 클래스를 만들어 넣으시면 구조는 거의 같습니다.

    이렇게 하는게 가장 깔끔하고, 디자인도 잘 붙일 수 있고,

    속도도 RecyclerView가 어느 정도 받쳐줍니다.

    특히 이미지 매핑할 때는 Glide를 추천합니다.


    그리고 클래스 정의할 때, 저는 그냥 public으로 정의하는 편입니다.

    안그러면 파일들이 너무 많이 생기고, setter getter가 너무 많이 생기죠.

    물론 그럴 필요가 있다면, 그렇게 해도 좋습니다.

    그 앱으로 몇년간 계속 개발할 목표라면, 그렇게 하시는 걸 추천합니다.

  • Willee21
    119
    2021-01-16 17:14:42

    아 그리고 expandable는 item_adapter_group의 안에 있는

    recyclerActor의 visibility를 gone, visible을 통해서 처리하면 됩니다.

  • 에킹텀
    28
    2021-01-17 04:15:21 작성 2021-01-17 04:15:46 수정됨

    답변 달아 주셔서 진심으로 감사합니다:)


    비전공자여서 어쩌구~ 한 언급은 저도 글 쓰고 그리 오래는 지나지 않은 뒤에 수정한 부분인데 보셨군요..!

    제가 생각이 짧았던 것 같습니다 저도 답변자님의 생각에 동의합니다

    지금 답변 달아주신 걸 발견하고 낮에 답변 내용대로 해보고 댓글 달아야지라고 생각했다가, 제가 수정을 했던 바람에 답변자님이 민망해지시는 상황이 될 수 있을 것 같아 지금 달아놓고 갑니다


    서치하는 분들을 위해 해보고 후기 댓글 다시 남기겠습니다!

  • Willee21
    119
    2021-01-17 15:13:18 작성 2021-01-18 01:05:28 수정됨

    문구에 너무 신경쓰시지 말자구요~ ^^; 
    저는 단지 관련이 없다는 코멘트를 달고자 한 것이고,
    기본적으로 질문자님의 질문을 높게 사고 있습니다.
    좋은 질문이고, 이런 질문들이 다른 개발자들에게 도움이 된다고 생각합니다.

    저는 개인적으로 전공자와 비전공자에는 차이가 없다는 생각이고요,
    비전공자들이 더 열정적이라고 생각합니다.
    저는 비록 전공자지만, 항상 부족함을 부끄럽게 생각하고 있습니다.
    사실 지금 하고 있는일이 학교에서 배운 것과는 상관없는 일들이 대부분이기도 하고요.


    리싸이클러뷰 두개를 겹쳐도 되고,
    리싸이클 뷰 하단에 ExpandableListView를 넣어도 큰 차이는 없을 겁니다.

    다만, 접근 하는 방식과 구조는 같을 겁니다.

    표현해야 할 데이터를 UI는 표현할 뿐이고요,

    입력된 값에 따라서 데이터가 검색 결과를 반영해서
    표현해야 할 데이터가 달라지는 것 뿐이죠.

    다만 SearchView를 사용하면 FilterClass를 정의해서 사용할 수 있다는 것입니다.
    FilterClass를 쓴다고 코딩이 줄어들지는 않아요. 오히려 늘어나죠.
    결국 데이터를 다루는 방식은 같아요.

    다만 Filter나 Search UI는 별도의 UI이고,
    여기서 필터나 검색어를 설정하고,
    데이터를 핸들링 하는 것은 adapter 내에서만 하는 것이,
    보다 구조적으로 단순화된다고 생각합니다.

    보여주기 위한 데이터의 구조와 필터링은
    한군데에서 하는 게 Readability 향상에 도움이 되기 때문입니다.
    로직이 여러 클래스로 흩어지면, 여러 클래스를 다 봐야 전체 로직이 이해가 되는 문제가 있습니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.