1) 리사이클러뷰 아이템 레이아웃 화면 꽉 채우기
<androidx.recyclerview.widget.RecyclerView
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
tools:listitem="@layout/item_layout" />
2) @Parcelize 사용하기
build.gradle (Module: app)
plugins {
id("kotlin-parcelize") // 추가
}
3) ItemAdapter
ViewHolder는 inner 아닌 단순 class로 작성.
NO_POSITION보다는 item이라는 변수를 nullable하게 만들어서 null이 아닐 때만 클릭 동작이 가능하도록 설정.
class ViewHolder(private val binding: ItemLayoutBinding, private val onClick: (Item) -> Unit) :
RecyclerView.ViewHolder(binding.root) {
private var item: Item? = null
init {
binding.root.setOnClickListener {
item?.let { // 아래 bind 함수에서 item 할당이 제대로 이루어졌다면 해당 item은 null이 아니기에 동작됨
onClick(it)
}
}
}
fun bind(item: Item) {
this.item = item // bind를 하여 해당 item을 지역 item 변수에 할당
binding.ivItem.setImageResource(item.imageResourceId)
binding.tvItem.text = item.item
binding.tvAddress.text = item.address
binding.tvPrice.text = item.getFormattedPrice()
binding.tvChatCount.text = item.chatCount.toString()
binding.tvLikeCount.text = item.likeCount.toString()
}
}
4) 전역적으로 사용하는 item의 경우 by lazy로 설정해보기
private val item by lazy {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.getParcelableExtra("item", Item::class.java)
} else {
intent.getParcelableExtra("item")
}
}
5) 함수로 분리(추상화)하여 가독성 높이고 유지보수성(Maintenance) 높이기 (single level abstraction)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDetailBinding.inflate(layoutInflater)
setContentView(binding.root)
setButtonClickListeners()
setViewWithItem()
}
6) Notification을 받기 위해서 Runtime Permission을 추가하기
private fun checkNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1);
}
}
}
7) 종료시 띄워주는 다이얼로그는 버튼 클릭할 때마다 매번 create() 객체를 생성하지 말고 lazy로 생성한다음 기존 객체를 계속 사용하면 좋을 것
private val exitDialog: AlertDialog by lazy {
createExitDialog()
}
private fun createExitDialog() =
AlertDialog.Builder(this)
.setMessage("종료하시겠습니까?")
.setPositiveButton("확인") { _: DialogInterface, _: Int ->
finish()
}
.setNegativeButton("취소") { dialogInterface: DialogInterface, _: Int ->
dialogInterface.dismiss()
}
.create()
728x90
'앱 개발 > Chapter_Curriculum' 카테고리의 다른 글
[심화 프로젝트] 회고 (0) | 2024.06.01 |
---|---|
[과제] 피드백 (앱 개발 심화) (0) | 2024.05.19 |
[숙련 프로젝트] 회고 (0) | 2024.04.30 |
Today I Learned and Studied (0) | 2024.04.17 |
Chapter 3-3 (앱 개발 숙련) (0) | 2024.04.09 |