Mobile/Android(Kotlin)

[Android/Kotlin] RecyclerView 아이템 클릭과 액티비티로 데이터 전송(item click and pass data)

개발왕 금골드 2020. 7. 23. 11:13
반응형

안녕하세요 골드입니다.

 오늘은 RecyclerView item click 이벤트와 Adapter.kt 파일에서 다른 액티비티로 데이터를 보내는 방법에 대해서 글을 쓰도록 하겠습니다.

 

RecyclerView를 생성하는 방법은 이곳을 참고하세요.

https://kumgo1d.tistory.com/43

 

[Android/Kotlin] RecyclerView를 사용해서 ListView와 GridView 만들기

안녕하세요 골드입니다.  오늘은 Android에서 RecyclerView를 사용해서 ListView와 GridView를 만드는 방법에 대해서 글을 쓰도록 하겠습니다.  Android Studio 3.1을 기준으로 안드로이드에서 정말 많이 사용�

kumgo1d.tistory.com

 

1. RecyclerView item click

리사이클러뷰에 나타나는 item을 클릭하는 방법을 보도록 하겠습니다. 먼저 RecyclerView.Adapter를 상속받는 Adapter class를 엽니다.

 

여러분이 작성한 Adapter class에는 두 가지가 있을 것입니다.

하나는 Adapter에서 아이템의 레이아웃을 넘겨주는 Holder class이고, 또 하나는 실제 화면에 데이터와 레이아웃을 연결하는 onBindViewHolder() 함수입니다. 

 

먼저 Holder class입니다.

Holder class의 생성자의 매개변수로 item View객체를 받을 것입니다. 이 View객체는 RecyclerView의 item입니다. 즉, 이 View객체를 이용해서 item 레이아웃에 접근 할 수 있습니다.

 

간단하게 init 함수를 만들어서 item에 대한 클릭 리스너를 추가합니다.

 

 

여러분이 작성한 코드와 조금 다를 수 있습니다. (빨간색 부분은 전혀 상관없는 부분이라는 뜻입니다.) 핵심은 Holder 클래스의 매개변수 itemView의 클릭 리스너를 init 안에 작성했다는 것입니다.

해당 클릭리스너에 동작하고자 하는 코드를 작성하면 됩니다.

 

두 번째는 onBindViewHolder() 입니다. 이 함수 안에서도 item에 대한 클릭 리스너를 정의할 수 있습니다. 

 

 

 

결과적으로 Holder 클래스 내부에서 사용하는 것과 같습니다. onBindViewHolder의 Holder 변수를 이용하는 것입니다. 작동되는지 간단하게 살펴보려면 Toast 메세지를 추가하는 것을 추천합니다.

 

1. - 1 Click Animation 

 클릭리스너가 잘 구현되었다면 한 가지 아쉬운 점이 있습니다. 바로 애니메이션입니다. 위에 코드를 작성했을 경우 클릭은 되지만 사용자가 클릭했는지 시각적으로 알려주는 애니메이션이 없습니다. 이 부분은 여러분이 item을 위한 레이아웃을 만들었던 xml파일에서 해결할 수 있습니다.

 

xml 최상위 레이아웃에 코드를 한 줄 추가합니다.

 

 

만약 한 줄로 제대로 작동되지 않는다면 코드를 더 추가합니다.

 

 

클릭 애니메이션이 작동하는 모습을 볼 수 있습니다.

 

 

 

 

2. RecyclerView item click for start activity

저는 item을 클릭하면 다른 액티비티로 넘어가게 만들고 싶습니다. 예를 들어서 메모장 어플리케이션을 사용할 때, 작성한 메모를 클릭하면 메모를 수정할 수 있는 다음 화면으로 넘어가는 것처럼 말입니다.

그러기 위해서 Intent를 사용합니다.

 

 

 클릭리스너의 코드 블록 안에 Intent를 추가합니다. itemView에 context가 있기 때문에 그걸 사용합니다. 저는 MemoActivity로 이동하지만, 여러분의 코드에 알맞는 이름을 넣어주세요. intent를 생성한 후 이동을 위해 startActivity를 작성하였습니다. 마찬가지로 itemView의 context를 사용했고, 작성한 Intent를 전달합니다. 마지막으로 특별한 option이 없다면 null을 입력하면 됩니다. 

 

 

2. - 1 Activity Back button 

 액티비티에서 back button을 사용하는 몇 가지 방법이 있지만 간단한 방법은 Manifest 파일에서 액티비티의 부모를 설정하는 것입니다. 앱의 상황에 따라 다르지만 위와 같이 MainAcitivty의 서브개념의 액티비티에 back button을 추가하는 가장 간단한 방법입니다.

 

 

 

 

3. Pass data to Activity

 특정 액티비티로 이동하는 것까지 성공했습니다. 아직도 많이 아쉽지만 특히 아쉬운 것은 새로운 액티비티가 실행되었을 때, 내가 작성했던 데이터가 그대로 있었으면 좋겠습니다. 그렇게 해야 작성했던 것을 수정할 수 있을테니까요. 꼭 그게 아니더라도 어떤 데이터를 Adapter class에서 액티비티로 전송하고 싶습니다.

 

이런 경우 Intent의 putExtra()를 사용합니다. putExtra()는 key-value를 갖는 자료구조입니다. 배열의 값을 인덱스로 가져오듯이, (array[0] = 1) putExtra()는 인덱스가 아닌 key로 값을 가져옵니다. 

 

먼저 putExtra()로 값을 보냅니다.

 

 

 작성한 intent에 보내고 싶은 데이터를 넣고 startActivity()에 넣습니다. 그러면 intent에 작성한 다른 액티비티로 데이터가 같이 전달됩니다. 

 

이제 액티비티에서 전달받은 값을 사용해줍니다. 아까 말한대로 key값으로 value를 가져올 수 있습니다.

 

 

이 코드에서 intent는 따로 선언한 코드가 아닌 주어지는 코드입니다. intent.get(기본자료형)Extra()를 사용하고 key값을 정확하게 입력하면 데이터를 가져올 수 있습니다.

 

 

 

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : stackoverflow.com/questions/50233068/passing-data-from-an-activity-back-to-recyclerview-adapter

반응형