반응형
ListView 에서는 SetOnItemClick 이벤트의 활용이 넘나 쉬었다. 그냥 선언하고 구현만 하면 되었으니, 그런데, RecycleView 을 사용해서 구현하다 보니 이런일이 생긴다. RecycleView 에서는 클릭 이벤트 등을 구현하는게 힘들다. 그래도 어쩌라 구현은 해야 되고.
폭풍 구글링~~~ 그래서 찾아낸 것은 이런 것들이다. RecycleView 에서 Holder 을 이용해서 item 을 배치 하고 그 Holder 의 item 을 클릭하는 것을 이용 하도록 하는 것이다.
public class ChatBotAdapter extends RecyclerView.Adapter<ChatBotAdapter.ViewHolder> {
private static final String TAG = "ChatAdapter";
private final ArrayList<ChatMsgModel> chatMsgModels;
String userEmail ;
public ChatBotAdapter(ArrayList<ChatMsgModel> items, String userEmail) {
this.chatMsgModels = items;
this.userEmail = userEmail;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.custom_chat_msg, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
ChatMsgModel vo = chatMsgModels.get(position);
...
holder.userid_tv.setText(vo.getNickName()); // userId 대신 nickName 으로 대체
holder.date_tv.setText(vo.getCrt_dt());
holder.content_tv.setText(vo.getContent());
}
@Override
public int getItemCount() {
return chatMsgModels.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ConstraintLayout my_cl, other_cl;
public TextView userid_tv, date_tv, content_tv
public ViewHolder(View view) {
super(view);
userid_tv = view.findViewById(R.id.userid_tv);
date_tv = view.findViewById(R.id.date_tv);
content_tv = view.findViewById(R.id.content_tv);
...
// 2021.11.01 item 클릭 처리를 위해서 추가
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
int pos = getAdapterPosition() ;
if (pos != RecyclerView.NO_POSITION) {
// 리스너 객체의 메서드 호출.
if (mListener != null) {
mListener.onItemClick(v, pos) ;
}
}
}
});
}
}
// 2021.11.01 리스너 객체 참조를 저장하는 변수
private ChatBotAdapter.OnItemClickListener mListener = null ;
// OnItemClickListener 리스너 객체 참조를 어댑터에 전달하는 메서드
public void setOnItemClickListener(ChatBotAdapter.OnItemClickListener listener) {
this.mListener = listener ;
}
public interface OnItemClickListener {
void onItemClick(View v, int position) ;
}
}
이렇게 adapter class 에서 OnItemClickListener 을 구현하고 그것을 호출해서 사용하면 되게 되는 것이다.
생각해 보니 이전에도 기술했던 내용인 것 같기는 한데... 뭐 어쩌랴... ㅋㅋㅋ 기억은 항상 되새김질을 해야 하는 것이고, 오랜만에 보게 되면 새로 보는 느낌이 든다.
반응형
이제 구현된 것을 활용하는 소스를 구현해 보자.
...
ChatBotAdapter adapter ;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityChatRoomBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
...
adapter = new ChatAdapter(chatMsgModels, userEmail);
binding.rv.setLayoutManager(new LinearLayoutManager(ChatRoomActivity.this));
binding.rv.setAdapter(adapter);
...
adapter.setOnItemClickListener(new ChatAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
...
}
});
Log.e(TAG, "onCreate -----------------------------------------") ;
}
이렇게 MainActivity 의 onCreate 에서 구현을 해 보면 ListView 에서는 해당 ListView.setOnClickListener 을 활용했다고 하면, RecycleView 에서는 RecycleView.Adapter 을 이용해서 adapter.setOnItemClickListener 을 활용하는 방법이 될 수 있다고 생각이 든다.
그럼... 이번에도 즐~ 코딩 하시길...
반응형
'모바일 앱(안드로이드)' 카테고리의 다른 글
안드로이드 앱 만들기 : NotificationCambat 의 기능 구현에 대한 이해 (3) | 2021.11.07 |
---|---|
안드로이드 앱 만들기 : 클립보드을 이용해 보기 (2) | 2021.11.04 |
안드로이드 앱 만들기 : Recycleview 을 구현하다 벌어지는 흔한 실수 (0) | 2021.11.02 |
안드로이드 앱 만들기 Firebase FCM 으로 메시지 전송하기 (4) | 2021.10.22 |
안드로이드 앱 만들기 Firebase 의 인증 기능 활용 (0) | 2021.10.18 |