post-custom-banner

대충 코드설명

TabFragment 하단에 RecyclerView를 넣어서 DataBinding으로 데이터들을 넣어주고, RecyclerView의 왼쪽부분에 checkbox가 있는 상황.
그리고 이 전체 체크박스를 한꺼번에 클릭할 수 있는 전체클릭 버튼이 TabFragment에 위치함.
우선 RecyclerView Databinding으로 구현된 체크박스가 클릭되게 하는 부분부터 설명하고 전체 체크박스 클릭 기능은 차차 작성하도록 하겠다.

1. RecyclerView 어댑터, ViewHolder 만들기

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.TestViewHolder>{
    public interface OnItemClickListener {
        void onItemClick(int pos, boolean b);
    }

    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.onItemClickListener = listener;
    }
    
    ...
    
    @Override
    public void onBindViewHolder(@NonNull TestViewHolder holder, int position) {
    	final int pos = position; // 클릭된 포지션 값
        ListItem item = listItems.get(pos);
        holder.bind(item);
        holder.checkBox.setTag(item);
        holder.checkBox.setChecked(item.getCheckYN());
        mCheckBoxes.add(holder.checkBox);
    }
    
    ...
    
    class TestViewHolder extends RecyclerView.ViewHolder{
    	public CheckBox checkBox;
        ListDataBinding binding;
        
        public TestViewHolder(ListDataBinding binding, ViewGroup parent) {
        	super(binding.getRoot());
            checkBox = binding.getRoot().findViewById(R.id.checkbox);
            this.binding = binding;
            
            //체크박스 이벤트 리스너
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    int pos = getAdapterPosition();
                    ListItems.get(pos).setCheckYN(b);
                    onItemClickListener.onItemClick(pos, b);
                }
            });
            
            
        }
}

2. Fragment.java 에서 setOnItemClickListener 구현하기.

		...
        mTestAdapter = new TestAdapter();
        //반드시 이벤트리스너를 setAdapter 하기 전에 넣어줘야 한다.
        mTestAdapter.setOnItemClickListener(new TestAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int pos, boolean b) {
                String cnt = String.valueOf(mTestAdapter.getItemCount());
                binding.allText.setText(cnt);
                CheckList checkList = new CheckList();
                if(b == true) {
                    checkList.setId(listItems.get(pos).getListId());
                    checkList.setPosition(pos);
                    binding.linearLayout.setVisibility(View.GONE);
                    binding.greenLinearLayout.setVisibility(View.VISIBLE);
                    checkLists.add(checkList);
                    binding.clickedText.setText(String.valueOf(checkLists.size()));
                } else {
                    if(checkLists.size() == 1) {
                        checkLists.clear();
                        binding.clickedText.setText("0");
                        binding.linearLayout.setVisibility(View.VISIBLE);
                        binding.greenLinearLayout.setVisibility(View.GONE);
                    } else {
                        for(int i = 0; i < checkLists.size(); i++) {
                           if (checkLists.get(i).getId() == listItems.get(pos).getListId()) {
                               checkLists.remove(i);
                               binding.clickedText.setText(String.valueOf(checkLists.size()));
                           }
                        }
                    }
                }
                Log.d("checklist", "" + checkLists.size());
            }
        });
        binding.recyclerView.setAdapter(mTestAdapter);
        ...
post-custom-banner

0개의 댓글