모바일 앱(안드로이드)

안드로이드 앱 만들기 : RecycleView.Adapter 에 클릭 이벤트 달아보기

Billcoreatech 2021. 11. 3. 09:10
반응형

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

 

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

반응형