recyclerView에서 데이터 업데이트하기

MainActivity에 RecyclerView를 만들어서 상품들을 띄워주고, 상품 클릭시 DetailActivity로 들어가서 해당 상품에 대한 자세한 내용들을 보여준다.
DetailActivity에서 하트 이미지를 클릭시 빨간 하트로변경, snackbar메세지를 띄워주고, 다시 메인액티비티로 돌아가면 해당 상품에 대한 이미지역시 빨간 하트로 변경시켜주고, 그옆에 숫자도 +1시켜줄 예정이다.
@Parcelize
data class Product(
val productIcon:Int,
val productName:String,
val productDes:String,
val seller:String,
val productPrice:Int,
val address:String,
var productLike:Int,
var productLikeIcon :Int,
val productChatting:Int
) : Parcelable{
companion object{
val dataList = mutableListOf(
Product(
R.drawable.sample1,
"산지 한달된 선풍기 팝니다",
"이사가서 필요가 없어졌어요 급하게 내놓습니다",
"대현동",
1000,
"서울 서대문구 창천동",
13,
R.drawable.heart,
25
))
}
}
데이터는 편의상 한가지만 써놨다.
각 상품들에 대해서
productIcon - 상품이미지
productName - 상품이름
productDes - 상품설명
seller - 판매자
productPrice - 상품가격
address - 판매자주소
productLike - 상품의 좋아요수
productLikeIcon - 상품의 좋아요 이미지(여기선 하트모양)
productChatting - 상품의 채팅수
를 정의해놨다.
메인화면에서 해당 상품클릭시 값을 넘길때 registerForActivityResult를 이용해서 객체의 내용들을 함께 보내줬다.
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
...
// MyAdapter를 초기화하고 결과 런처를 설정
val adapter = MyAdapter(Product.dataList)
resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Product? = result.data?.getParcelableExtra("updatedProduct")
data?.let {
val index = adapter.mItems.indexOfFirst { product -> product.productName == it.productName }
if (index != -1) {
adapter.mItems[index] = it
adapter.notifyItemChanged(index)
}
}
}
}
adapter.setResult(resultLauncher)
이 안에서 notifyItemChanged을 이용해서 recyclerView를 업데이트 하였다.
어뎁터에서 원래 넘기던 방식 대신 resultLauncher를 이용해서 detailActivity로 값을 넘겨준다.
val intent = Intent(holder.itemView.context, DetailActivity::class.java).apply {
putExtra("data", mItems[position])
}
resultLauncher.launch(intent)
//holder.itemView.context.startActivity(intent)
기존에는 주석처리 돼있는 방식으로 값을넘겼었지만 지금은 resultLauncher를 이용해서 값을 넘겨준다.
이 화면에서 받은 데이터를 가지고 화면을 띄워준다. 먼저 데이터를 받아오는 방식은 기존과 같다.
val selected = intent.getParcelableExtra<Product>("data")
이렇게 키값이 data인 값을 Parcelable형태로 받아와준다. 여기서 만약 선택된상품의 이름을 가져오고싶다면 selected?.productName을 사용해서 가져와주면 된다.
여기부터 추가되는 내용이다. 기존에는 하트 이미지를 클릭해도 아무 이벤트가 없었지만 여기서 이미지를 교환하고 recyclerView를 업데이트 시켜줄거다.
heartImage.setOnClickListener {
if (productLikeIcon == R.drawable.heart) {
//Snackbar 메세지 표시
Snackbar.make(view,"관심 목록에 추가되었습니다.",Snackbar.LENGTH_SHORT).show();
// 이미지가 heart일 때, pressedheart로 변경하고 productLike + 1
heartImage.setImageResource(R.drawable.pressedheart)
productLikeIcon = R.drawable.pressedheart
productLike = productLike?.plus(1)
} else {
// 이미지가 pressedheart일 때, heart로 변경하고 productLike - 1
heartImage.setImageResource(R.drawable.heart)
productLikeIcon = R.drawable.heart
productLike = productLike?.minus(1)
}
// 변경된 데이터를 Intent에 담아서 MainActivity로 전달
val resultIntent = Intent().apply {
putExtra("updatedProduct", Product(productIcon ?: 0, productName ?: "", productDes ?: "",
seller ?: "", price ?: 0, address ?: "",
productLike ?: 0, productLikeIcon ?: 0, productChatting ?: 0))
}
setResult(Activity.RESULT_OK, resultIntent)
}
이렇게 해주면 하트 이미지 클릭시 기본 하트였다면 빨간색 꽉찬 하트로 이미지를 변경시켜주고, 바로 resultIntent를 이용해서 값을 다시 MainActivity로 넘겨줘서 recyclerView를 실시간 업데이트 시켜줄 수 있다.