no image
안드로이드 스튜디오 리사이클러뷰 체크박스 리스너 만들기
체크박스 리스너를 왜만드냐 하면 일단 리사이클러뷰에 체크박스를 달아놨는데 그 체크박스를 프래그먼트나 액티비티에서 관리하고 사용할 수 있을 필요가 있기 때문이다... 그래서 몇가지 좀 찾아봤는데 해결이 안되어서 아무 생각 없이 안하고 있다가 오랜만에 바인딩을 없애고 다시 하니까 되네 에라이 ㅋㅋ 리사이클러뷰 만드는 방법은 다들 알테니넘어가고 리사이클러뷰에 인터페이스를 만들어야한다 리사이클러뷰에 인터페이스 만들기 인터페이스는 다른 파일로 따로 만들어도 되지만 귀찮으니 그냥 만듬 /* 리스너 인터페이스 구현부 */ public interface CheckBoxClickListener { void onClickCheckBox(int flag, int pos); } 이거를 리사이클러뷰 안에 아무곳이나 넣어주면 된..
2022.10.10
no image
[안드로이드, Java] 리사이클뷰 아이템 마진 적용하기, RecyclerView Item Margin
제목 : 리사이클뷰 아이템 마진 적용하기, RecyclerView Item Margin 문제 프레그먼트에 리사이클뷰를 넣어서 리스트를 만들었는데 만들고 보니 아이템들이 따닥따닥 붙어있었다. 그래서 margin prams를 사용해서 했더니 안되어서 다른 방법을 찾아보다가 데코레이션을 써야한다고 한다 방법 데코레이션 클래스 만들기 Decoration 클래스를 하나 만든다. 이름은 아무렇게나 하면 된다 데코레이션 클래스 설정 새로 만든 클래스에 RecycleView.ItemDecoration을 extends하고 생성자로 Context context를 받아온다음 Ctr + O를 눌러 getItemOffsets를 생성한다 그리고 아래 코드 처럼 작성하면 위 사진처럼 margin이 적용된 것 처럼 쓸 수 있다 pa..
2022.08.03
728x90
반응형

체크박스 리스너를 왜만드냐 하면 일단 리사이클러뷰에 체크박스를 달아놨는데 그 체크박스를 프래그먼트나 액티비티에서 관리하고 사용할 수 있을 필요가 있기 때문이다... 그래서 몇가지 좀 찾아봤는데 해결이 안되어서 아무 생각 없이 안하고 있다가 오랜만에 바인딩을 없애고 다시 하니까 되네 에라이 ㅋㅋ


리사이클러뷰 만드는 방법은 다들 알테니넘어가고

리사이클러뷰에 인터페이스를 만들어야한다

리사이클러뷰에 인터페이스 만들기

인터페이스는 다른 파일로 따로 만들어도 되지만 귀찮으니 그냥 만듬

/* 리스너 인터페이스 구현부 */
public interface CheckBoxClickListener {
    void onClickCheckBox(int flag, int pos);
}

이거를 리사이클러뷰 안에 아무곳이나 넣어주면 된다

맨 밑에 리사이클러뷰 전체 코드를 올릴거임

/* 체크박스 리스너 */
private CheckBoxClickListener mCheckBoxClickListener;

그리고 리스너 인터페이스를 리사이클러뷰에 생성

/* 리스너 메소드 */
public void setOnCheckBoxClickListener(CheckBoxClickListener clickCheckBoxListener) {
    this.mCheckBoxClickListener = clickCheckBoxListener;
}

그리고 리스너 메소드도 만든다

이렇게 3개를 리사이클러뷰 코드에 넣으면 됨

 

리스너 호출 결과 만들기

/* 체크박스 리스너 */
holder.checkBox.setOnClickListener(v -> {
    if(holder.checkBox.isChecked()) {
        // 체크가 되어 있음
        mCheckBoxClickListener.onClickCheckBox(1, position);
    }
    else {
        // 체크가 되어있지 않음
        mCheckBoxClickListener.onClickCheckBox(0, position);
    }
});

내가 리사이클러뷰에 바인딩으로 체크박스를 구현해놨더니 제대로 동작하지 않아서 holder로 했더니 잘되더라...

 

리사이클러뷰 전체 코드

public class WordsCsvRvAdapter extends RecyclerView.Adapter<WordsCsvRvAdapter.ViewHolder> {

    /* 어댑터에 필요한 변수들 */
    private CustomListWordsSelectItemBinding mBinding;
    private List<WordsItem> wordsItemList;
    private Context context;

    /* 리스너 인터페이스 구현부 */
    public interface CheckBoxClickListener {
        void onClickCheckBox(int flag, int pos);
    }

    /* 체크박스 리스너 */
    private CheckBoxClickListener mCheckBoxClickListener;

    /* 어댑터 생성자 */
    public WordsCsvRvAdapter(Context context, List<WordsItem> wordsItemList) {
        this.context = context;
        this.wordsItemList = wordsItemList;
    }

    @NonNull
    @Override
    public WordsCsvRvAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        mBinding = CustomListWordsSelectItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(mBinding.getRoot());
    }

    @Override
    public void onBindViewHolder(@NonNull WordsCsvRvAdapter.ViewHolder holder, int position) {
        WordsItem wordsItem = wordsItemList.get(position);
        mBinding.tvWord.setText(wordsItem.getWord());
        mBinding.tvMeaning.setText(wordsItem.getMeaning());
        mBinding.tvPronunciation.setText(wordsItem.getPronunciation());
        mBinding.tvMemo.setText(wordsItem.getMemo());
        mBinding.tvLanguage.setText(wordsItem.getLanguage());

        /* 체크박스 리스너 */
        holder.checkBox.setOnClickListener(v -> {
            if(holder.checkBox.isChecked()) {
                // 체크가 되어 있음
                mCheckBoxClickListener.onClickCheckBox(1, position);
            }
            else {
                // 체크가 되어있지 않음
                mCheckBoxClickListener.onClickCheckBox(0, position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return wordsItemList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private CheckBox checkBox;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            checkBox = itemView.findViewById(R.id.checkbox);
        }
    }

    /* 리스너 메소드 */
    public void setOnCheckBoxClickListener(CheckBoxClickListener clickCheckBoxListener) {
        this.mCheckBoxClickListener = clickCheckBoxListener;
    }

}

이거는 내가 지금 만들고 있는 앱에서 사용되는 리사이클러뷰 코드인데 위에 적어놨던 코드가 어디어디 들어가는지 정도만 참고하면 좋을 것 같음

 

프래그먼트/액티비티에서 리사이클러뷰 체크박스 리스너 호출

/* 리사이클러뷰 어댑터 */
WordsCsvRvAdapter wordsCsvRvAdapter = new WordsCsvRvAdapter(requireContext(), wordsItemList);
mBinding.rvWords.setHasFixedSize(true);

wordsCsvRvAdapter.setOnCheckBoxClickListener(new WordsCsvRvAdapter.CheckBoxClickListener() {
    @Override
    public void onClickCheckBox(int flag, int pos) {
        /* 체크박스를 눌렀을 때 리스너로 상태(눌렸는지, 위치)를 불러옴 */
        Log.d("__star__", flag+""+pos);
    }
});
mBinding.rvWords.setAdapter(wordsCsvRvAdapter);

보통 뭔가누르면 setOnClickListener 이런식으로 만들어져있길래 나도 그렇게 만들었음

어댑터에 체크박스 리스너 메소드를 저런식으로 호출하면 됨

 

오른쪽 체크박스를 클릭하고 때면 나오게 만들었음 잘됨

728x90
반응형
728x90
반응형

제목 : 리사이클뷰 아이템 마진 적용하기, RecyclerView Item Margin

 


문제

프레그먼트에 리사이클뷰를 넣어서 리스트를 만들었는데 만들고 보니 아이템들이 따닥따닥 붙어있었다. 그래서 margin prams를 사용해서 했더니 안되어서 다른 방법을 찾아보다가 데코레이션을 써야한다고 한다

 


방법

데코레이션 클래스 만들기

 

Decoration 클래스를 하나 만든다. 이름은 아무렇게나 하면 된다

 

데코레이션 클래스 설정

 

새로 만든 클래스에 RecycleView.ItemDecoration을 extends하고 생성자로 Context context를 받아온다음

Ctr + O를 눌러 getItemOffsets를 생성한다

그리고 아래 코드 처럼 작성하면 위 사진처럼 margin이 적용된 것 처럼 쓸 수 있다

 

package com.zynar.starvoca.recyclerview;

import android.content.Context;
import android.graphics.Rect;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.zynar.starvoca.R;

public class PostItemDecoration extends RecyclerView.ItemDecoration {

    private int size;

    public PostItemDecoration(Context context) {
        this.size = context.getResources().getDimensionPixelSize(R.dimen.words_margin);
    }

    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.bottom = size;
        outRect.top = size;
    }
}

 

생성자로 context를 받아온 이유는 프레그먼트의 requreContext()를 받아서 픽셀을 구하는 함수를 사용해야한다 getResources().getDimensionPixelSize() 사용하기 위함이다. 이것은 나중에 여백의 간격이 된다

 

getItemOffsets의 인자들은 나도 잘 모른다 그냥 ctr + o하니까 자동으로 생성된거다

outRect의 top과 bottom을 size로 넣어주면 여백이 만들어진다

 

리사이클뷰 적용하기

그리고 리사이클뷰를 어댑터와 적용하는 코드로 가서 setAdapter() 전에 해당 데코레이션을 적용시켜주면된다

 

PostItemDecoration decoration = new PostItemDecoration(requireContext());
rvList.addItemDecoration(decoration);

 


참고 링크

https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.ItemDecoration

 

RecyclerView.ItemDecoration  |  Android Developers

androidx.car.app.managers

developer.android.com

https://youtu.be/AtzJUDvRktI


 

728x90
반응형