Kotlin/TIL

TIL (04.23)

내손은개발 🐾 2024. 4. 23. 21:52

RecyclerView item 데이터 수정

 

dataSource에 데이터 변경 메서드 생성

   //dataSource.kt
    fun updateItem(position: Int,newData:Data){
        if(position in 0 until dataList.size){
            dataList[position] = newData
        }
    }

Main에서 Detail로 값 넘기는 부분

       //MainFragment.kt
        //Detail에 선택한 item 데이터 전달
        adapter.itemClick = object : DataAdapter.ItemClick {
            override fun onClick(view: View, position: Int) {
                val selectedData = dataSource.getDataList()[position]
                //Detail에 데이터 전달
                val detailFragment = DetailFragment().apply {
                    arguments = Bundle().apply {
                        putParcelable("selectedData", selectedData) [1]
                        putInt("selectedPosition",position) [2]
                    }
                }
                requireActivity().supportFragmentManager.beginTransaction().apply {
                    replace(R.id.fragmentContainer, detailFragment)
                    addToBackStack(null)
                    commit()
                }
            }
        }

기존에는 [1]번의 코드로 데이터를 아예 넘겨주어서 Detail 페이지에서 각각의 데이터에 맞게 데이터를 넣어주었다.

하지만 데이터가 수정되는 position의 값을 알아야한다.

때문에 position값도 같이 넘겨줘서 변경될 경우에 다시 position값을 출력한다.

만약 position값을 넘겨서 Detail에서 데이터 리스트에서 position의 값을 넘겨올 경우에는 상관없지만 내가 작성한 코드에는 position값[2]을 넘기지 않아서 넣어주었다.

Detail에서 값 변경 → Main으로 다시 전송

main 값 받기

       //DetailFragment.kt
        val selectedPosition = arguments?.getInt("selectedPosition")
        //데이터 받음
        arguments?.getParcelable("selectedData", Data::class.java)?.let {
            inputEachData(it)
        }

값을 변경할 수 있는 editText와 변경 후 button을 누르면 전송되도록 만듬

       //DetailFragment.kt
        binding.btnGoChat.setOnClickListener {
            val newTitle = binding.etTest.text.toString() [1]
            if (newTitle.isNotEmpty() && selectedPosition != null) { [2]
                binding.tvDetailTitle.text = newTitle [3]

                val bundle = Bundle().apply { [4]
                    putString("editedTitle", newTitle) [5]
                    putInt("editedPosition",selectedPosition) [6]
                }
//                requireActivity().supportFragmentManager.setFragmentResult("editedTitle", bundle)
                parentFragmentManager.setFragmentResult("editedTitle",bundle)
            }
        }

설명할게 없어서 간단히 설명하면

버튼을 눌렀을 때 editText의 값이 null이 아닐 경우 [2]

새로운 데이터를 입혀서 바뀐 것처럼 보이고 [3]

bundle 사용. [4]

변경된 값을 넘기고 [5]

main에서 받은 position값을 다시 돌려 보낸다.[6]

Main → Data변경

    //MainFragment.kt
    //데이터 수정
    private fun updateSelectedItemTitle(newTitle: String, position: Int) {
        val dataList = dataSource.getDataList()
        if (position in 0 until dataList.size) { // position이 유효한 범위 내에 있는지 확인

            // 데이터 소스에서 해당 위치의 데이터 가져오기
            val dataToUpdate = dataList[position]

            // 데이터의 제목 변경
            dataToUpdate.title = newTitle

            // 변경된 데이터를 데이터 소스에 다시 저장
            dataSource.updateItem(position, dataToUpdate)

            //변경사항 알림
            adapter.notifyItemChanged(position)
        }
    }
//MainFragment.kt
onViewCreated(){
	...
        parentFragmentManager.setFragmentResultListener("editedTitle",this){ _, bundle ->
            val editedTitle = bundle.getString("editedTitle")
            val editedPosition = bundle.getInt("editedPosition")
            if (!editedTitle.isNullOrEmpty()) {
                updateSelectedItemTitle(editedTitle,editedPosition)
            }
        }

해당 position에 title값 변경

'Kotlin > TIL' 카테고리의 다른 글

SharedPreference (TIL 04.30)  (0) 2024.04.30
TIL (04.29) - LiveData 실습  (0) 2024.04.29
TIL (04.22)  (0) 2024.04.22
TIL(04.18)  (1) 2024.04.18
TIL (04.17)  (0) 2024.04.17