[Kotlin] RecyclerView Adapter에서 리스트 수정하기

Hand·2022년 10월 1일
0

Android

목록 보기
13/17

💡 RecyclerView를 사용하기 위해선 Adapter를 연결해주어야 합니다. 근데 adapter를 사용해주기 위해서 넘겨준 리스트 중 원하지 않는 데이터가 생겨 그것을 adapter 내에서 수정할 수 있는 상황이 발생합니다. 저 또한 그랬어서 이 글을 작성합니다.

리스트를 수정할 상황은 정렬을 다시한다던가, 삭제, 추가 등의 작업만 있는 것 같습니다.
그 중 저는 삭제하는 작업을 위해서 구현을 해보았습니다.

invoke
먼저 invoke의 개념부터 알아야합니다.
invoke란 이름없이 간편하게 호출될 수 있는 함수를 의미합니다.
Unit
Unit은 쉽게 말해서 void라고 생각하시면 됩니다.

우리는 반환이 Unit인 함수를 기반이 되는 Activity()나 Fragment()에서 구현하고,
이를 adapter의 파라미터로 넣어줘서 adapter내에서
activity나 fragment의 함수를 사용하는 방법을 쓸 것입니다.

Adapter의 파라미터에 함수 추가해주기

Adapter :

class NewPostImagesAdapter(
    private val images: ArrayList<Uri>,
    private val onClickDeleteIcon: (image: Uri) -> Unit
) : RecyclerView.Adapter<NewPostImagesAdapter.ViewHolder>() {

저는 이렇게 adapter의 파라미터로 이미지들이 담긴 리스트와, Unit을 반환하는 함수를 넣어주었습니다.

adapter에서 이벤트 발생 시 실행시킬 함수 구현하기

그냥 간단하게 리스트에서 제거하고자 하는 것을 제거한 후,
adapter.notifyDataSetChanged() 를 통해 어뎁터를 새로고침(?) 해주시면 됩니다.

Activity or Fragment :

private fun deleteTask(images: ArrayList<Uri>, image: Uri) {
	images.remove(image)
	adapter.notifyDataSetChanged()
}

이제 이 코드를 adapter의 파라미터에 넣어서 사용하도록 하겠습니다.

파라미터로 함수 넘겨주기

Acrivity or Fragmen :

private fun setAdapter() {
	if (images != null) {
		val recyclerViewState =	recyclerView.layoutManager?.onSaveInstanceState()
		adapter = NewPostImagesAdapter(images, onClickDeleteIcon = {
			deleteTask(images, it)
		})
		
        recyclerView.adapter = adapter
		recyclerView.layoutManager?.onRestoreInstanceState(recyclerViewState)
		adapter.notifyDataSetChanged()
	}
}

위 코드를 보시면

adapter = NewPostImageAdapter(images, onClickDeleteIcon = {
			deleteTask(images, it)
		})

를 확인하실 수 있습니다.

onClickDeleteIcon 함수가 실행되면, deleteTask() 함수를 실행하겠다! 의 의미입니다.
it의 경우 adapter에서 설정해준 파라미터 타입이 들어가게 됩니다.
밑의 삭제에서 설명드리겠습니다.

adapter에서 삭제

Adapter :

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
	holder.cancel.setOnClickListener {
		onClickDeleteIcon.invoke(image)
	}
}

cancel 버튼을 클릭하면, onClickDeleteIcon 함수를 실행하겠다! 의 의미입니다.
위에서 private val onClickDeleteIcon: (image: Uri) -> Unit로 설정해두었습니다.
Uri 타입의 변수를 넣어주면, activity나 fragment에서의 it에 여기서 넣어준 변수가 들어가게 됩니다.

이렇게 되면 리스트에서 정상적으로 삭제되어 recyclerView가 업데이트 되는 모습을 확인하실 수 있습니다.

profile
화이팅!

0개의 댓글