2026/02/19

오늘의 이야기

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 을 활용하는 방법이 될 수 있다고 생각이 든다. 


 


그럼... 이번에도 즐~ 코딩 하시길...





댓글 없음:

댓글 쓰기

오늘의 이야기

조금 지나긴 했지만, 이슈가 되었던 요소수, 그걸 판매하는 주유소 정보를 공공데이터 포털에서 제공하기 시작했다.  현재 (2021.12.20 기준)는 111개 주유소의 정보만 제공이 되고 있는 것 같으나, 일단 그걸 이용해서 데이터 제공을 하는 앱을 ...