-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
해결됨
bookmark탭 에러 질문드립니다
22.03.29 17:14 작성 조회수 123
0
안녕하세요 선생님, 질문드립니다.
현재 초급편 북마크탭만들기까지 완료하고 게시판만들기로 막 넘어간 상황입니다.
앱을 처음 실행할 때는 북마크 페이지가 정상적으로 작동하는데
홈, 꿀팁 등 다른 탭을 들어갔다 나온 후 다시 북마크 탭으로 돌아가면 아래처럼 빈 화면이 됩니다.
제가 뭔가 실수를 한 것 같은데, 따로 에러가 뜨지 않아 어떤 코드가 문제인지 알 수가 없어 깃허브 전체 코드 첨부드립니다. https://github.com/shinyelee/my-solo-life
답변을 작성해보세요.
0
개복치개발자
지식공유자2022.03.30
안녕하세요
확인해보니 아래에서 문제가 발생합니다.
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)
}
}
답변 1