2017-12-16 10 views
0

Ich habe mehrere Schalter in CustomAdapter implementiert.Android, ListView mehrere Schalter Ausgabe

CustomAdapter-Code unten.

sche_swt = (Switch)convertView.findViewById(R.id.ctschedule); 
    loc_swt = (Switch)convertView.findViewById(R.id.ctlocation); 

    sche_swt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean is_checked) { 
      if (compoundButton.getId() == R.id.ctschedule) { 
       if (is_checked == true) { 
        contactItemList.get(position).setSchedule(true); 
       } else { 
        contactItemList.get(position).setSchedule(false); 
       } 
      } 
     } 
    }); 

    if (contactItemList.get(position).getScheduleInt() == 1) { 
     sche_swt.setChecked(true); 
    } 
    else 
     sche_swt.setChecked(false); 

    loc_swt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean is_checked) { 
      if (compoundButton.getId() == R.id.ctlocation) { 
       if (is_checked == true) { 
        contactItemList.get(position).setLocation(true); 
       } 
       else { 
        contactItemList.get(position).setLocation(false); 
       } 
      } 
     } 
    }); 

    if (contactItemList.get(position).getLocationInt() == 1) { 
     loc_swt.setChecked(true); 
    } 
    else 
     loc_swt.setChecked(false); 


    return convertView; 
} 

Eine einzige Zeile sieht aus wie

name 
phone_number 
switch 1 | switch 2 

Und ich Zustand des Schalters gespeichert

Zum Beispiel:

1 line = switch(false) | switch(true) 
2 line = switch(false) | switch(true) 
3 line = switch(true) | switch(false) 

... und so weiter.

Nachdem ich meine App beendet, erneut ausgeführt Listview Ergebnis sieht aus wie

1 line = switch(true) | switch(false) 
2 line = switch(true) | switch(false) 
3 line = switch(true) | switch(false) 

Was ist los ??

Antwort

0

Problem möglicherweise mit der Verwendung von Position Variable im Listener oder mit dem Aufruf der setChecked-Methode. Versuchen Sie zu folgen, ich habe nur für den Zeitplan Schalter, tun Sie das gleiche für Standort wechseln.

sche_swt = (Switch)convertView.findViewById(R.id.ctschedule); 
loc_swt = (Switch)convertView.findViewById(R.id.ctlocation); 

// setting tag 
sche_swt.setTag(position) 
loc_swt.setTag(position) 

// you need to remove the listener because when you call setChecked() 
// it will invoke the listener unnecessarily and it might affect the 
// state of the view. 
sche_swt.setOnCheckedChangeListener(null); 
if (contactItemList.get(position).getScheduleInt() == 1) { 
    sche_swt.setChecked(true); 
} 
else 
    sche_swt.setChecked(false); 

sche_swt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean is_checked) { 
     if (compoundButton.getId() == R.id.ctschedule) { 
      // using the tag to get the position. 
      int position = compoundButton.getTag(); 
      if (is_checked == true) { 
       contactItemList.get(position).setSchedule(true); 
      } else { 
       contactItemList.get(position).setSchedule(false); 
      } 
     } 
    } 
}); 


return convertView; 

Wenn Sie nicht wissen, was Tag ist oder warum ich es benutzt und nicht die Position, lesen Sie diese https://stackoverflow.com/a/5291891/1749223 .Ich hoffe, dass die oben behebt das Problem.