inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)

북마크 탭 만들기 - 3

bookmark탭 에러 질문드립니다

해결된 질문

225

신예리

작성한 질문수 9

0

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

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

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

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

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

bookmark kotlin android firebase

답변 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)
}

}

 

0

신예리

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

이미지가 기본이미지인지 확인

0

143

1

NavController error 발생

0

156

1

fragment 생성하고 메인에서 불러왔는데 안뜹니다.

0

151

2

67강 댓글

0

113

2

7강 데이터바인딩 에러

0

129

2

Firebase 스토리지 유료화 문제

1

317

2

게시글 이미지가 파이어베이스에 저장되지 않습니다.

0

192

2

AVD 갤러리에 이미지 저장 안되는 문제

0

258

2

이미지 받아오는 방법?

0

213

2

회원탈퇴 기능을 추가하려고 합니다.

0

199

2

상태바 질문 드립니다.

0

122

1

섹션2 인트로 페이지 꾸미기 질문 드립니다.

0

124

1

게시판 글을 길게 쓸경우

0

131

2

로그인 로그아웃

0

188

2

갤럭시 연결시 게시판에 업로드한 사진이 보이지 않아요.

0

223

2

웹뷰 AVD 실행안됨

0

201

1

자막켜기가 안되요 ㅜ.ㅜ

1

200

1

리사이클러뷰, 그리드레이아웃 오류

0

194

2

리사이클러뷰 오류 해결 방법이 궁금합니다.

0

205

1

firebase 스마트폰으로 연결이 안되는데 원인이 있을까요

0

275

2

안드로이드 스튜디오 게시글 이미지 업로드 유무

0

231

1

firebase 설정 오류

0

312

2

홈 화면 커뮤니티

0

183

1

게시판 글 읽기

0

248

2