Android setOnCheckedChangeListener снова звонит, когда возвращается старый вид
Я не могу решить проблему с методом getGroupView.
проблема заключается в том, что прослушиватель setOnCheckedChangeListener вызывается много раз.
Скажем, я проверяю определенный элемент-флажок. Затем я просматриваю его вне поля зрения и затем прокручиваю назад. Случилось так, что слушатель снова вызван. И проблема в том, что я храню checkbox-id в arraylist внутри этого слушателя, чтобы использовать его позже в коде. Следствием этого является то, что больше элементов добавляется в arraylist каждый раз, когда слушатель вызывается и искажает данные.
Есть ли решение? что мне делать? Должен ли я, например, отменить регистрацию слушателя?
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View view = null;
final int group_position = groupPosition;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.activity_phrase, parent, false);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.groupTitle);
viewHolder.checkBox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (buttonView.isChecked()) {
checked.add((Integer) viewHolder.checkBox.getTag());
}
else {
checked.remove((Integer) viewHolder.checkBox.getTag());
}
}
});
view.setTag(viewHolder);
viewHolder.checkBox.setTag(groupPosition);
} else {
view = convertView;
((ViewHolder)view.getTag()).checkBox.setTag(groupPosition);
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(titles[groupPosition]);
for (int i = 0; i < checked.size(); i++) {
if (checked.get(i) == group_position) {
holder.checkBox.setChecked(true);
}
else if (checked.get(i) != group_position) {
holder.checkBox.setChecked(false);
}
}
return view;
}
Ответы
Ответ 1
Какую версию Android вы используете?
Кажется, проблема для нескольких компонентов, особенно с методом checkedChange() (CheckBox, RadioButton), и я не могу дать хорошее объяснение, почему это происходит.
Я бы предположил, потому что он регистрирует изменение состояния позиции и захватывает изменение других свойств? Аналогичная проблема была рассмотрена здесь
В любом случае обходной путь вокруг этого может заключаться в добавлении OnClickListener()
.
CheckBox yourCheckBox = (CheckBox) findViewById (R.id.yourId);
yourCheckBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//is chkIos checked?
if (((CheckBox) v).isChecked()) {
//Case 1
}
else
//case 2
}
});
Ответ 2
OnCheckedChangeListener
работал у меня с одним условием
if(buttonView.isShown())
{
//ToDo code
}
Ответ 3
Добавьте ниже в Макет ToggleButton:
android:saveEnabled="false"
Это позволит убедиться, что android не сохраняет состояние проверки до RestoreInstance
и, в свою очередь, не приведет к изменению состояния, которое вы испытали.
Ответ 4
Установите для прослушивателя значение null перед вызовом функции setCheck() и включить после этого, например:
checkBox.setOnCheckedChangeListener (null);
checkBox.setChecked(true);
checkBox.setOnCheckedChangeListener (this);
Ссылка: Изменить значение флажка без запуска onCheckChanged
Ответ 5
Я столкнулся с одной и той же проблемой и несколько часов боролся со всеми обсуждениями, связанными с этим. Я попытался исправить это, сохранив
viewHolder.checkBox.setTag(groupPosition);
это утверждение перед viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
этим слушателем. И код работает точно так, как ожидалось.
Ответ 6
Добавить дополнительный оператор if isShown()
в методе OnCheckedChange и решает проблему, вызванную вызовом OnCheckedChangeListener несколько раз.
Не нужно менять на onClickListener:
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isShown()) {
if (buttonView.isChecked()) {
//Do something
} else {
//Do something
}
}
}
Ответ 7
Я застрял в одной и той же проблеме и нашел способ, используя при прослушивании кликов
Сначала проверьте, установлен ли флажок, назначенный ему onclicklistener или нет. Если это не означает, что адаптер устанавливает значение для первого.
if(!holder.checkbox.hasOnClickListeners())
{
holder.checkbox.setChecked(data.get( position ).getSelected());
}
Теперь после проверки этого
holder.checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
data.get( position ).setSelected(holder.checkbox.isChecked());
holder.checkbox.setChecked(data.get( position ).getSelected());
Toast.makeText(getApplicationContext(),
data.get( position ).get_number()+" : "+position, Toast.LENGTH_LONG).show();
}
});
Надеюсь, проблема с прокруткой исчезнет. Здесь хорошо работает.
Ответ 8
сильный текст Существует много способов решить проблему
checkBoxSelect.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// write here your code for example ...
if(isChecked){
// do somtheing when is checked
}else{
// do somthing when is removed the check**strong text**
}
}
});
** и существует другой способ **
checkBoxSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(((CheckBox)v).isChecked()){
//do something
}else{
//do something
}
});