원본출처: 티스토리 바로가기
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 을 활용하는 방법이 될 수 있다고 생각이 든다.
그럼... 이번에도 즐~ 코딩 하시길...
댓글
댓글 쓰기