Изменить фон определенного элемента на цвет, а другие элементы — на другой цвет

#android

#Android

Вопрос:

Отображение

Я передаю список в диалоговое окно. В том смысле, что если я выберу один элемент, фон должен измениться на зеленый. И снова, если я выберу другой элемент, фон этого элемента должен измениться на зеленый, а ранее выбранному фону элемента должно быть присвоено значение по умолчанию.

Например: если я выберу «Диаграмма 3», фон должен измениться на зеленый. И если я выберу «Диаграмма 5», фон «Диаграммы 5» должен измениться на зеленый, а фон «Диаграммы 3» должен измениться на значение по умолчанию.

Пожалуйста, помогите мне с этим. Заранее спасибо.

 public ConfigureDialogAdapter(Context context, List<PhrToolBar> listData) {
  mInflater = LayoutInflater.from(context);
  mToolBarList = listData;
}

public void setDialogClickListener(DialogClickListener dialogClickListener) {
  mDialogClickListener = dialogClickListener;
}

public void setToolBarList(List<PhrToolBar> list) {
  mToolBarList = list;
  notifyDataSetChanged();
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

  View rootView = mInflater.inflate(R.layout.configure_dialog_list_adapter, parent, false);
  return new ViewHolder(rootView);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

  PhrToolBar current = mToolBarList.get(position);
  viewHolder.textView.setText(current.getTitle());

  if (current.isVisible()){
     viewHolder.checkBox.setChecked(true);
  } else {
     viewHolder.checkBox.setChecked(false);
  }
}

public class ViewHolder extends RecyclerView.ViewHolder {

  CheckBox checkBox;
  TextView textView;

  public ViewHolder(View itemView) {
    super(itemView);

    checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
    textView = (TextView) itemView.findViewById(R.id.text_view);
    textView.setOnClickListener(onTextClick);
    checkBox.setOnCheckedChangeListener(onCheckBoxClick);
  }

  View.OnClickListener onTextClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

      textView.setTextColor(Color.WHITE);
      textView.setBackgroundResource(R.color.colorPrimary);

      if (mDialogClickListener != null) {
         mDialogClickListener.onItemClick(getAdapterPosition());
      }
    }
  };

  CompoundButton.OnCheckedChangeListener onCheckBoxClick = new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

      if (mDialogClickListener != null) {
        if (isChecked) {
           mDialogClickListener.onCheckBoxClick(true, getAdapterPosition());
        } else {
           mDialogClickListener.onCheckBoxClick(false, getAdapterPosition());
        }
      }
    }
  };
}

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

Ответ №1:

Создайте селектор, который можно нарисовать, подобный этому (в папке res / drawable):

 <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_selected="true">
   <shape>
         <solid android:color="@color/green" />
   </shape>
</item>

<item android:state_selected="false">
    <shape>
       <solid android:color="@android:color/transparent" />
    </shape>
</item>
</selector>
  

Затем в вашем необработанном макете просто добавьте фоновый макет и пометьте raw как доступный для просмотра :

 android:background="@drawable/selector"
android:clickable="true"
  

Кроме того, добавьте setSelected в свой OnClickListener :

 View.OnClickListener onTextClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

      textView.setTextColor(Color.WHITE);
      textView.setSelected(true);

      if (mDialogClickListener != null) {
         mDialogClickListener.onItemClick(getAdapterPosition());
      }
    }
  };
  

Каждый раз, когда вы помечаете свой элемент как setSelected(true) , он будет зеленым!
Кроме того, вы должны сохранить состояние выбора в массиве и изменить свой код на что-то вроде этого :

 public class ViewHolder extends RecyclerView.ViewHolder {
 //Add this, this array will store selected items
 SparseBooleanArray selectedItems;

 [...]
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

  PhrToolBar current = mToolBarList.get(position);
  viewHolder.textView.setText(current.getTitle());

  //add this, If the item position is in the array, it will be marked as selected (so green), otherwise background will be default one (transparent)
  viewHolder.textView.setSelected(selectedItems.get(position, false));

  if (current.isVisible()){
     viewHolder.checkBox.setChecked(true);
  } else {
     viewHolder.checkBox.setChecked(false);
  }
}
[...]

View.OnClickListener onTextClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

      //Add this to add the position to the array storing selected item !       
      if (selectedItems.get(getAdapterPosition(), false)) {
         selectedItems.delete(getAdapterPosition());
      } else {
         selectedItems.put(getAdapterPosition(), true);
      }  
 notifyDataSetChanged ();

      textView.setTextColor(Color.WHITE);

      if (mDialogClickListener != null) {
         mDialogClickListener.onItemClick(getAdapterPosition());
      }
    }
  };
  

Комментарии:

1. Когда я нажимаю на элемент, фон становится зеленым. Если я уберу палец, фон станет белым.

2. это работает. Но когда я нажимаю на другой элемент, ранее выбранный фон элемента остается зеленым. Мое требование заключается в том, что ранее выбранный фон элемента должен стать белым.

3. отредактировано, вам нужно отслеживать выбранный / невыбранный элемент!

4. Это не работает, братан. Фон ранее выбранного элемента не меняется.

5. используйте notifyd1tasetchanged после события click