• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

bookmark탭 에러 질문드립니다

22.03.29 17:14 작성 조회수 123

0

안녕하세요 선생님, 질문드립니다.

현재 초급편 북마크탭만들기까지 완료하고 게시판만들기로 막 넘어간 상황입니다.

앱을 처음 실행할 때는 북마크 페이지가 정상적으로 작동하는데

홈, 꿀팁 등 다른 탭을 들어갔다 나온 후 다시 북마크 탭으로 돌아가면 아래처럼 빈 화면이 됩니다.

제가 뭔가 실수를 한 것 같은데, 따로 에러가 뜨지 않아 어떤 코드가 문제인지 알 수가 없어 깃허브 전체 코드 첨부드립니다. https://github.com/shinyelee/my-solo-life

답변 1

답변을 작성해보세요.

0

안녕하세요

확인해보니 아래에서 문제가 발생합니다.

if(bookmarkIdList.contains(dataModel.key.toString())) {
items.add(item!!)
itemKeyList.add(dataModel.key.toString())
}

bookmarkIdList를 받아오지 않은 시점에서 bookmarkIdList에 있는 것들을 조건으로 items, itemKeyList를 조회해서 생기는 문제입니다.

 

디버깅을 위해 로그를 찍었는데 아래와 같이 변경해서 로그를 확인해보시겠어요?

bookmarkIdList 를 받아온 다음 getCateData()  가 실행되도록 하였습니다. 

package com.shinyelee.my_solo_life.Fragments

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.navigation.findNavController
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.shinyelee.my_solo_life.R
import com.shinyelee.my_solo_life.contentsList.BookmarkRVAdapter
import com.shinyelee.my_solo_life.contentsList.ContentsModel
import com.shinyelee.my_solo_life.contentsList.ContentsRVAdapter
import com.shinyelee.my_solo_life.databinding.FragmentBookmarkBinding
import com.shinyelee.my_solo_life.utils.FBAuth
import com.shinyelee.my_solo_life.utils.FBRef

class BookmarkFragment : Fragment() {

// binding
private lateinit var binding : FragmentBookmarkBinding

private val TAG = BookmarkFragment::class.java.simpleName

val bookmarkIdList = mutableListOf<String>()
val items = ArrayList<ContentsModel>()
val itemKeyList = ArrayList<String>()
lateinit var rvAdapter: BookmarkRVAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {

// binding
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bookmark, container, false)

// 1. 전체 카테고리의 컨텐츠 데이터를 다 가져옴
// getCateData()

// 2. 사용자가 북마크한 정보를 다 가져옴
getBookmarkData()

// 3. 전체 컨텐츠 중 사용자가 북마크한 정보만 보여줌
rvAdapter = BookmarkRVAdapter(requireContext(), items, itemKeyList, bookmarkIdList)
val rv : RecyclerView = binding.bookmarkRV
rv.adapter = rvAdapter
rv.layoutManager = GridLayoutManager(requireContext(), 2)

// bookmark - home
binding.homeT.setOnClickListener {
it.findNavController().navigate(R.id.action_bookmarkFragment_to_homeFragment)
}
// bookmark -> tip
binding.tipT.setOnClickListener {
it.findNavController().navigate(R.id.action_bookmarkFragment_to_tipFragment)
}
// bookmark -> talk
binding.talkT.setOnClickListener {
it.findNavController().navigate(R.id.action_bookmarkFragment_to_talkFragment)
}
// bookmark -> store
binding.storeT.setOnClickListener {
it.findNavController().navigate(R.id.action_bookmarkFragment_to_storeFragment)
}
return binding.root

}

// 1. 전체 카테고리의 컨텐츠 데이터를 다 가져옴
private fun getCateData() {

Log.e(TAG, "getCateData")

val postListener = object : ValueEventListener {

override fun onDataChange(dataSnapshot: DataSnapshot) {

Log.e(TAG, "dataSnapshot.children" + dataSnapshot.children.count())

for(dataModel in dataSnapshot.children) {
Log.e(TAG, "dataModel : " + dataModel.toString())
val item = dataModel.getValue(ContentsModel::class.java)
// 3. 전체 컨텐츠 중 사용자가 북마크한 정보만 보여줌
if(bookmarkIdList.contains(dataModel.key.toString())) {
items.add(item!!)
itemKeyList.add(dataModel.key.toString())
}


}

Log.e(TAG, "items" + items.toString())
Log.e(TAG, "itemKeyList" + itemKeyList.toString())

rvAdapter.notifyDataSetChanged()
}

override fun onCancelled(databaseError: DatabaseError) {
// Getting Post failed, log a message
Log.w("ContentsListActivity", "loadPost:onCancelled", databaseError.toException())
}

}
FBRef.cate1.addValueEventListener(postListener)
FBRef.cate2.addValueEventListener(postListener)
}

// 2. 사용자가 북마크한 정보를 다 가져옴
private fun getBookmarkData() {
val postListener = object : ValueEventListener {

override fun onDataChange(dataSnapshot: DataSnapshot) {
for(dataModel in dataSnapshot.children) {
Log.e(TAG, dataModel.toString())
bookmarkIdList.add(dataModel.key.toString())
}
Log.e(TAG, "bookmarkIdList" + bookmarkIdList.toString())
getCateData()
}

override fun onCancelled(databaseError: DatabaseError) {
// Getting Post failed, log a message
Log.w("ContentsListActivity", "loadPost:onCancelled", databaseError.toException())
}

}
FBRef.bookmarkRef.child(FBAuth.getUid()).addValueEventListener(postListener)
}

}

 

신예리님의 프로필

신예리

질문자

2022.03.30

해결됐습니다 선생님 감사합니다!