본문 바로가기
Android 개발/RecyclerView, List

RecyclerView 로 listview 정복 Part.2 #리스트 아이템 클릭

by Developer88 2016. 12. 25.
반응형

이전글에서 RecyclerView로 리스트를 만드는 것에 대해서 정리해보았었는데요.

오늘은 만든 리스트를 유저가 터치할 수 있고,

그에 대해 간단하게 토스트팝업을 띄우는 것에 대해 정리해보겠습니다.


참고로 리스트뷰 만드는 방법에 대해서는 아래 링크에 정리되어 있습니다~.

>> RecyclerView 로 listview 정복 Part1


1. 리스트 한줄 클릭시 반응하기


먼저 개발할 시나리오를 정리해보면 다음과 같습니다.

리스트에 있는 여러개의 줄중 하나의 줄 전체를 유저가 클릭하면,

터치한 줄의 데이터를 받아와서, 토스트 팝업을 띄운다.

그럼 아래에서 구현하면서 정리해보겠습니다.


1-1. 유저가 터치하는 것을 누가 알까?


유저가 터치했는지 어떻게 알수있을까요?

유저는 뷰를 터치한 것이고, 뷰는 뷰홀더에 있으니까.

뷰홀더에서 View를 가지고 있는, 

itemView에 OnClickListener를 달면 알 수 있겠네요.




1-2. 인터페이스 생성


이제, 유저가 리스트의 뷰를 터치한 것은 OnClickListener로 알게 되었으니,

터치한 줄의 데이터를 알아와서 그에 맞는 토스트  팝업을 보여줘야 합니다.


구체적으로는 몇번째줄의 아이템을 클릭한 건지 알아와서, 

그 줄에 데이터를 받아와야 하는건데요.


이것은 리스트의 뷰와 데이터를 연결해주는 Adapter의 영역이니,

Adapter에서 Interface를 구현하여(Implement),

ViewHolder에 리스너를 넘겨주어,

뷰홀더가 클릭을 들으면, 

받아들인 리스너를 이용해 Adapter의 메소드를 실행하도록 하면 되겠네요.

이제, 아래에서 하나하나 구현해보겠습니다.


혹시, 인터페이스에 대해서 정리한 것을 보고싶으시면,

아래 링크를 확인해주세요~.

>>> 안드로이드를 위한 자바 인터페이스 #다중상속 #콜백 <<<

(이 내용중에서도 2번째인 콜백에 관한 글을 봐주시면 됩니다~)


먼저 인터페이스 파일을 만들겠습니다.

이름은 OnListItemClickListener라고 붙이구요.

구현하도록 할 메소드는 onListItemClick이라고 할께요.

외부에 파일로 생성해도되고, ViewHolder클래스 내부에 넣어도 됩니다.


그리고, 인자로 position을 받도록 할 건데요. 

이유는 몇번째줄인지 viewHolder에서 getAdapterPosition()으로 알수 있기 때문에,

그것을 이용해서, 어댑터에서 데이터를 보여주기 위함입니다.




이제 이 Inteface를 이미지와 같이, adapter에서 implement하겠습니다.

implement하면 onListItemClick을 구현하라고 나오는데요.

구현은 아래에서 하도록 하겠습니다.




1-3. Adapter에서 ViewHolder로 리스너 전달


그런데, 어댑터에서 뷰홀더로 리스너를 전달하려면 어떻게 해야할까요?
이전에는 생성자의 인자로 넘겨봤었는데요.
이번에는, ViewHolder에 setOnListItemClickListener라는 메소드를 만들고,
어댑터에서 이 메소드를 실행해서 전달받을 수 있도록 해보겠습니다.
(interface에서 글로 정리한 것처럼, 생성자로 넘겨도 괜찮습니다.)

먼저 뷰홀더파일에서 setOnListItemClickListener를 구현할께요.



그 다음, 어댑터에서 뷰홀더를 생성하고, 그 객체에 메소드를 실행하며, 리스너를 넘깁니다.

여기서 this가 OnListItemClickListener입니다.(OnListItemClickListener를 implement했기 때문입니다.)




1-4. ViewHolder에서 onClick구현


이제 뷰홀더에서 onClick시에 리스너의 onListItemClick을 구현하도록 해주면 됩니다.

이 때, getAdapterPosition()메소드를 실행해주는 이유는,

Adpater가 onListItemClick을 구현할 때, 

몇번째 줄의 데이터인줄 알아야, 정확하게 그 줄의 데이터를 뽑을 수 있기 때문인데요.

getAdapterPosition이 몇번째 줄인지 알려줍니다. 




1-5. Adapter에서 onListItemClick구현


이제 다 되었습니다. onListItemClick을 어떻게 구현할지만 정하면 되는데요.

테스트용 예제이므로, 가볍게 토스트팝업을 날리도록 하겠습니다. 



다 되었네요~.

아. 혹시나 해서지만, mContext는 어댑터를 mainActivity에서 adapter생성시 인자로 얻어온 것인데요.

mainActivity에 토스트팝업을 보여주기 위해 컨텍스트가 필요하기 때문입니다~.

728x90

댓글