Alertdialg флажок с пользовательских соответствующие адаптер и своего слушателя
Я использую custom adpater in AlertDialog
. В этом адаптере я использую TextView and CheckBox
..
Теперь я хочу обработать CheckBox setOnCheckedChangeListener
для проверки checked или unchecked CheckBox.. И в соответствии со статусом флажка, я хочу реализовать некоторый код. Но этот слушатель уволен не один раз.. Так как же мне с этим справиться? Предложите мне, если у кого-нибудь есть идея.
И именно моя проблема заключается в том, что когда я установил флажок, я хочу увеличить некоторое значение, а когда я снял флажок, я хочу уменьшить некоторое значение.но я не могу сказать точно. значение sum, и если я прокручиваю, то это значение sum изменяется.. так что же мне делать?
Ниже приведен мой пользовательский адаптер:
private class Updateinfo_ServiceAdapter extends BaseAdapter
{
@Override
public int getCount() {
// TODO Auto-generated method stub
return _options_services.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Viewholder holder;
LayoutInflater inflater=getLayoutInflater();
if(convertView==null)
{
convertView=inflater.inflate(R.layout.row_updateinfo_service, null);
holder=new Viewholder();
holder.txtname=(TextView)convertView.findViewById(R.id.serviceName);
holder.chkSelected=(CheckBox)convertView.findViewById(R.id.chk);
convertView.setTag(holder);
}
else
{
holder=(Viewholder)convertView.getTag();
}
holder.txtname.setText(_options_services[position]);
holder.chkSelected.setChecked(_selections_services[position]);
holder.chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked) {
allowServicesSum = allowServicesSum
+ Integer.parseInt((String) services[position]
.getSystemServiceID());
System.out.println("AllowService sum is "+allowServicesSum);
} else {
allowServicesSum = allowServicesSum
- Integer.parseInt((String) services[position]
.getSystemServiceID());
System.out.println("AllowService sum is "+allowServicesSum);
}
}
});
if(_selections_services[position])
{
holder.chkSelected.setEnabled(false);
}
else
{
holder.chkSelected.setEnabled(true);
}
return convertView;
}
private class Viewholder
{
TextView txtname;
CheckBox chkSelected;
}
}
1 ответ:
Вы забыли, что в случае повторного использования существующего
Самый простой способ избежать этой проблемы-позвонитьconvertView
прослушиватель уже установлен. Таким образом, когда вы делаетеholder.chkSelected.setChecked
, это вызовет прослушиватель, который был установлен в предыдущий раз, когда вы вернули это представление изgetView
.holder.chkSelected.setOnCheckedChangeListener(null);
сразу после строкиholder=(Viewholder)convertView.getTag();
. Это гарантирует отсутствие прослушивателя при последующем вызовеsetChecked
, после чего вы можете добавить прослушиватель снова.