Kotlin : RecyclerView item EditText 중복 에러 해결

2023. 3. 27. 10:08[Android APP] feat. Kotlin/Kotlin 공부

문제

1. RecyclerView Item에 EditText가 포함되어 있다.

2. RecyclerView Item을 추가하고, EditText를 수정할 수 있으며, 추가할 때 초기값을 넣어주고 setText로 세팅해준다.

3. 수정된 EditText값을 Item Data에 실시간으로 수정해주고 싶다.

4. TextWatcher를 onBind 부분에 넣어줬다.

5. error - 아이템을 수정한 뒤 추가 버튼을 누르면 처음 들어가는 초기값으로 전에 수정된 값들이 바뀐다.

 

원인

여러 방법과 여러 이유들을 생각하며 삽질해봤다.

내 경우에는 TextWatcher 사용 부분에서 각 아이템에 Listener가 끊기지 않고 사용되었고, RecyclerView에서 Recycle이 일어나면서 다른 아이템에도 영향을 미쳤다.

 

해결

1. onBind 부분에 TextWatcher를 연결해준다.

@SuppressLint("NotifyDataSetChanged")
override fun onBindViewHolder(viewHolder: OutsideViewHolder, position: Int) {
    val listPosition = outSideData[position]

    viewHolder.watcher = viewHolder.binding.outsideItemEditText.addTextChangedListener {
        listPosition.parentTitle = viewHolder.binding.outsideItemEditText.text.toString()
    }

    viewHolder.binding.attachBtn.setOnClickListener {
        attachBtn.invoke(position)
    }

    val innerDataList = listPosition.fileList
    viewHolder.innerAdapter.setData(innerDataList)

    viewHolder.bind(listPosition)
}

 

2. 재사용 될 때 리스너를 해제시켜준다.

override fun onViewRecycled(holder: OutsideViewHolder) {
    // Remove the TextWatcher when the view is recycled
    holder.binding.outsideItemEditText.removeTextChangedListener(holder.watcher)
}

 

반응형