본문 바로가기

앱 개발/Chapter_Curriculum

[과제] 피드백 (앱 개발 숙련)

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