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

[코틀린] Fragment에 리사이클러뷰를 중첩해서 넣으려고 합니다.(어댑터 연결 질문)

0 추천

말 그대로 리사이클러뷰 안에 리사이클러뷰를 넣어서 중첩해서 넣으려고 합니다.

데이터는 파이어베이스에서 불러왔습니다.

부모 리사이클러뷰까지는 구현에 성공했고 자식 리사이클러뷰의 파이어베이스 데이터 불러오기부터 어댑터 연결을 부모 리사이클러뷰 어댑터에 작성했습니다.

잘 동작하는 부모 리사이클러뷰 코드를 그대로 가져와서 자식 리사이클러뷰에 필요한 클래스나 변수에 맞게 변경만 했습니다.

부모 리사이클러뷰에서 자식 리사이클러뷰에 넣을 데이터는 잘 불러오는 것을 로그로 확인했습니다.

아래 코드는 부모 리사이클러뷰 구현 시 데이터 집어넣는 glide 등등이 들어있는 bind() 안에 들어있는 코드입니다.

val db = FirebaseFirestore.getInstance()
            val queryText2: Query = db.collection("spiceTable")
            var queryText3: Query
            val storageRef2 = Firebase.storage.reference.child("scentnote/spiceimage")
            var j: Int = 1
            var detailSpiceList = mutableListOf<SpiceDetailValue>()
            queryText2.get().addOnSuccessListener { documents ->
               //부모 리사이클러뷰 항목 내에서 반복하는 반복문
             .addOnSuccessListener { documentx ->
              //자식 리사이클러뷰 항목 파이어베이스에서 불러오기
            }.addOnCompleteListener {
                nAdapter = context?.let { NoteSubRecyclerviewAdapter(it, detailSpiceList) }
                fragment2NoteParentItemBinding?.fragment2NoteChildList?.adapter = nAdapter
                val gridLayoutManager = GridLayoutManager(context, 4)
                fragment2NoteParentItemBinding?.fragment2NoteChildList?.layoutManager = gridLayoutManager
            }
            detailSpiceList = mutableListOf<SpiceDetailValue>()

자식 리사이클러뷰의 어댑터가 NoteSubRecyclerViewAdapter인데, 그 파일에는 어디에 로그를 찍어도 아예 나오질 않습니다. 제가 생각하기에는 부모-자식 어댑터 연결이 안 된 것 같습니다.

어댑터를 연결하는 위 문장은 부모 리사이클러뷰를 연결할 때와 동일한 방식이며 자식 리사이클러뷰와 연결하는 부분 자체를 Fragment에도 넣어봤는데도 결과가 똑같았습니다.

그리고 로그를 onSuccessListner 마지막에 한번, onCompleteListener 시작할 때 한번 찍어봤는데, 

onCompleteListener 부분의 로그가 먼저, onSuccessListner 부분의 로그가 나중에 나옵니다.

서버 데이터 불러오는 시간때문인가 싶어서 1초 대기 후 onCompleteListener가 동작하도록 해봤는데 그냥 로그가 1초 늦을 뿐 똑같습니다.

도와주시면 감사하겠읍니다...

Sionok (120 포인트) 님이 2022년 1월 7일 질문
다음 유저께서 하신 질문들을 살펴보시면 이미 원하는 답이 있을 수 있으니 먼저 확인해 보세요.

https://www.masterqna.com/android/user/codeslave/questions

참고로, 가장 핵심적인 부분 중의 하나는 거의 대부분의 경우 RecyclerView.Adapter나 ViewHolder 는 데이터를 어떻게 가져오는지 알 필요가 없습니다. 주어진 데이터를 어떻게 보여줄 지만 처리하면 됩니다. 따라서 Firebase로 데이터 가져오는 부분을 어댑터를 사용하는 곳으로 옮기시고, 여기에서 데이터를 가져오고 난 다음에 어댑터를 갱신해주는 방식으로 전환하는 걸 생각해 보세요.
어댑터를 먼저 연결하고 db를 불러온 후 setItem이라는 함수를 만들어서 해볼까 합니다. 그런데 nAdapter가 setItem이라는 함수를 받아주질 않네요..  
nAdapter.setItem(detailSpiceList)
/////
 fun setItem(List:SpiceDetailValue){
        detailSpiceList.add(List)
    }
이런식으로 해봤습니다.
detailSpiceList와 SpiceDetailValue가 어떤 타입인지 알 수가 없어서 그렇지만 타입이 안맞아서 그럴 겁니다. detailSpecailList가 ArrayList<SpiceDetailValue> 또는 MutableList<SpiceDetailValue>타입어야 겠죠. 그리고 파라미터 이름으로 'List'를 사용하는 건 좋지 않습니다. List는 자바의 java.util 클래스이기 때문에 이상하게 보입니다.  싱글 아이템이면 'item', 아이템의 리스트이면setItems(items: ...) 와 같이 사용하시면 좋을 듯 합니다.
NoteSubRecyclerviewAdapter의 생성자에 왜 Context가 필요한지 궁금하네요. 아주 특별한 경우가 아니면 어댑터에 Context를 넘겨서 사용할 일이 없거든요. LayoutInflater를 가져오려고 하신거면 onCreateViewHolder에서 LayoutInflater.from(parent.context)를 해서 가져오면 됩니다. Context를 넘기게 되면 어댑터를 사용하는 클래스와의 의존관계를 쓸데없이 더하는 거라 추천하지 않습니다.
그리고 Binding 클래스들은 NonNull 타입으로 사용하세요(fragment2NoteParentItemBinding). Binding 클래스들은 컴파일 시에 이미 만들집니다 그리고 binding에 대한 레퍼런스가 널이 된 후에 접근하는 것은 문제가 있는 코드입니다. 이런 경우는 버그라고 할 수 있으며 앱에 크래시되는게 낫습니다. 그래야 개발시에 조기에 발견하고 문제를 고치겠죠.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...