마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리사이클러뷰 선택한 포지션 컬러 검정색 나머진 흰색으로 바꾸기

0 추천
ll_carBookList_options.setOnClickListener(v -> {
    if(holder.getBindingAdapterPosition() == position){
        holder.ll_carBookList_options.setBackground(Status_DataBridge.getMainContext().getDrawable(R.drawable.carbook_list_option_select));
        holder.tv_carBook_list_option_item.setTextColor(Status_DataBridge.getMainContext().getColor(R.color.clr_ffffff_20213e));
    }else {  ?
    }
});
포지션을 선택하면 선택한 포지션을 검정색으로 바꾸는건 됐습니다
그런데 다시 똑같은 포지션 선택하면 색이 흰색으로 안 바뀌는것과
이미 선택한게 하나 있는 상태에서 다른걸 선택하면 기존건 흰색, 방금 선택한건 검정색으로 되게 하고싶습니다...
jay_choi (530 포인트) 님이 2022년 12월 14일 질문

1개의 답변

0 추천

선택이 되었는지 아닌지 알 수 있도록 상태를 괸리하셔야 할 것 같네요. 현재는 해당 포지션이 눌렀느냐만 알 수 있기 때문에 구분해서 처리할 수가 없습니다.

SparseBooleanArray를 사용하세요.

 https://developer.android.com/reference/android/util/SparseBooleanArray

선택된 포지션을 키값으로 하고 선택시에는 해당 값을 토글 시키시면 될 것 같네요. 아래코드를 참고해서 어떻게 토클 상태를 관리하는지 이해하신 다음 적절하게 적용하시기 바랍니다. 코드는 단순히 머리 속에서 나온 것이므로 완전하지 않습니다.

// Adapter Item class (님의 소스에서는 확인이 안되므로 임의로 가정)
public class ListItem {
    private boolean selected; // 추가
    // getter, setter 추가
}

// Adapter class
public class MyAdapter ...  {

public interface ItemClickListener {
    void onItemClicked(int position);
}

private List<ListItem> items;

private SparseBooleanArray selectedState = new SparseBooleanArray();

...


private void selectItemAt(int position) {
    for (int i =0 i < items.size; i++) {
        if (i == position) {
           boolean isSelected = !selectedState.get(position)
           selectedState.put(position, isSelected);
       } else {
           selectedState.put(i, false);
      }   
   }
   nofifyDataSetChanged();
}

private ListItem getItem(int position)  {
      return listItem.setSelected(selectedState.get(position));
}

@Overrid
public onCreateViewHolder(ViewGroup parent, int viewType) {
   View ItemView = LayouInflater.from(parent.getContext(),....);
   return new MyViewHolder(itemView, new ItemClickListener() {
      @OVerride
       public void onItemClicked(int position) {
         selectItemAt(position);
       }
   });
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
     holder.bind(getItem(position));
} 
}


// ViewHolder
public class MyViewHolder ... {

private View  ll_carBookList_options;
private TextView tv_carBook_list_option_item;


public MyViewHolder(View itemView, MyAdapter.ItemClickListerner listener) {
   super.MyViewHolder(view);
 
   // TODO  : findViewById추가  

    // ll_carBookList_options -> itemView??
    ll_carBookList_options.setOnClickListener(v -> {
         listener.onItemClicked(hoder.getBindingAdpaterrPosition());
   });
}
 
public void bind(ListItem item) {
     if(item.isSelected){
        ll_carBookList_options.setBackground(Status_DataBridge.getMainContext().getDrawable(R.drawable.carbook_list_option_select));
        tv_carBook_list_option_item.setTextColor(Status_DataBridge.getMainContext().getColor(R.color.clr_ffffff_20213e));
    }else {  
        // 흰색 설정
    }
}

}

 

아이템을 선택할 때 selectitemAt을 호출하고 notifyDataSetChanged를 호출하면 될 것 같습니다.

spark (226,420 포인트) 님이 2022년 12월 14일 답변
spark님이 2022년 12월 15일 수정
...