#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