오늘은 지금까지만들었던 이미지검색, 보관 앱에서 보관함에서 아이템을 클릭해서 데이터를 삭제했을때, 이미지검색화면에서 아이템에 하트모양이 그대로 보이던걸 해결했다.
이미지검색은 카카오API를 이용해서 데이터를 가져왔다. 그리고 가져온 데이터를 리사이클러뷰로 화면에 뿌려줬다.
여기서 아이템클릭시 새로 만들어준 리스트에 해당아이템의 데이터를 넣어줬고, 이 리스트를 이용해서 보관함에서 리사이클러뷰로 화면에 뿌려줬다.
data class SearchDocument(
val collection: String,
val datetime: String,
val display_sitename: String,
val doc_url: String,
val height: Int,
val image_url: String,
val thumbnail_url: String,
val width: Int,
var isLike: Boolean = false
)
카카오 API는 이렇게 가져와서 아이템클릭시 해당 아이템의 IsLike를 true로 바꿔주었다.
이렇게 만드니 문제가 있었는데, 보관함은 먼저 아래와 같이 구성되어있다.
@Parcelize
data class SelectedItem(
val thumbnail:String,
val siteName:String,
val time:String,
): Parcelable{
companion object{
var myLikeList = mutableListOf<SelectedItem>()
}
여기서 아이템이 클릭되면 myLikeList에서 데이터를 제거시켜주는데, 원본 데이터에서 isLike의 값을 건드릴수가 없었다.
그래서 생각해낸 방법은 보관함에서 companion object를 이용해서 리스트하나를 만들어준다.
companion object {
var myCancleList = mutableListOf<String>()
}
그리고 아이템을 클릭할때 myLikeList에서 제거해주기 전에 해당 데이터의 고유값인 thumbnail값을 새로만든 리스트에 저장해줬다.
override fun onClick(item: SelectedItem) {
val selectedThumb = item.thumbnail
val selectedSite = item.siteName
val selectedTime = item.time
KeepFragment.myCancleList.add(selectedThumb)
var result = SelectedItem(selectedThumb, selectedSite, selectedTime)
SelectedItem.myLikeList.remove(result)
keepAdapter.notifyDataSetChanged()
}
그리고 이미지검색 화면으로 돌아올때 원본데이터의 썸네일과 가져온리스트의 값을 비교해서 같은 곳에서 isLike의값을 false로 바꿔주고 데이터를 갱신시켜줬다.
private fun cancleDataChange() {
KeepFragment.myCancleList.forEach {
for (item in searchAdapter.mItems) {
when (item.itemType) {
SearchItemType.IMAGE -> {
val searchDocument = item.searchItem as SearchDocument
if (it == searchDocument.thumbnail_url) {
searchDocument.isLike = false
break
}
}
SearchItemType.VIDEO -> {
val searchDocumentVideo = item.searchItem as SearchDocumentVideo
if (it == searchDocumentVideo.thumbnail) {
searchDocumentVideo.isLike = false
break
}
}
}
}
}
KeepFragment.myCancleList.clear()
searchAdapter.notifyDataSetChanged()
}
여기서는 이미지검색뿐만 아니라 동영상검색도 같이 되는 화면이여서, 두가지로 나눠서 써줬다.