Android: Problem mit Switch im Custom List Adapter - Android, Listview, Debugging, Objekt, Switch-Anweisung

Ich habe eine Vorlagenseite und auf dieser Seite kann ich Vorlagen hinzufügen und löschen, die ihnen Namen und Beschreibungen geben.

Jede Vorlage ist ein Objekt, das aus Name, Beschreibung, Power und Enable besteht.

  • Durch Klicken auf eine Vorlage wird eine andere Listenansicht mit Optionen geladen.
  • Jede Option ist eine Instanz eines Objekts namens Option.
  • Jede Option hat einen Schalter, den ich umschalten kann.
  • Wenn ich dann die Vorlage speichere, aktualisiere ich in der Datenbank Werte, ob diese ein- oder ausgeschaltet waren.

SO springt direkt auf das Problem.

Wir können über die erste Vorlagenlistenansicht hinausgehen, aber auf die nächste, die Optionslistenansicht.

Diese Listenansicht enthält nur 2 Optionen, Power und Enable. Hier ist, wie ich diese Optionen erstelle.

TEMPLATEPOWER("Turn on device", "Switching this will turn on and off the fitting"),
TEMPLATEENABLED("Enable Device", "Switching this will enable and disable the device");
  • In einfachen Worten, es ist nur ein enum
  • Ich habe dann eine Control-Optionen, die diese enum behandelt.

Steuerdatei:

  public ArrayList<Option> populateTemplateActions() {
actions.add(Option.TEMPLATEPOWER);
actions.add(Option.TEMPLATEENABLED);
return actions;
}

Jetzt zum Einstellen der Listenansicht. Um dies zu tun:

  • Ich erstelle ein Array von Optionen und rufe die obige Methode auf, um diese Enumerationsobjekte dem Array hinzuzufügen
  • Ich gebe dieses Array dann an den Adapter weiter.
  • Ich übergebe auch das Fragment, da ich das Template-Objekt im Fragment setzen muss.

Füllen des Arrays:

templateOptions = control.populateTemplateActions();

Erstellen der Listenansicht:

adapter = new TemplateOptionAdapter(
getActivity(), templateOptions, template, ViewTemplate.this);
templateOptionsView.setAdapter(adapter);

adapter.notifyDataSetChanged();

Sobald ich im Adapter bin, stelle ich die Textansichten und den Schalter ein. Ich beschäftige mich dann mit dem Einstellen der Stromversorgung und aktivieren Optionen durch Verwendung von Change Listener auf dem Schalter.

  • Zuerst überprüfe ich das Optionszeilenobjekt, um zu sehen, ob es a) Power oder b) Enable ist.
  • Dann setze ich es auf checked oder not checked.
  • Der Listener wartet dann auf Änderungen und wenn die Änderungen eintreten, werden die Methoden entsprechend angepasst.
  • Ich übergebe dann dieses geänderte Objekt zurück in das Fragment, das die Listenansicht enthält, damit ich die Werte in die Datenbank einfügen kann.

Um genau zu sein, werde ich den gesamten Adapter-Code unten posten:

public class TemplateOptionAdapter extends BaseAdapter {

private Context context;
private ArrayList<Option> templateList;
private String name;
private Template template;
private Boolean checked;
int power;
int enable;
Option option;
ViewTemplate viewTemplate;

public TemplateOptionAdapter(Context context, ArrayList<Option> list, Template template, ViewTemplate viewTemplate) {
this.context = context;
templateList = list;
this.template = template;
this.viewTemplate = viewTemplate;
}

@Override
public int getCount() {

return templateList.size();
}

@Override
public Object getItem(int position) {

return templateList.get(position);
}

@Override
public long getItemId(int position) {

return position;
}

@Override
public View getView(int position, View convertView, ViewGroup arg2) {
option = templateList.get(position);

if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.template_option_view_row, null);

}
TextView templateName = (TextView) convertView.findViewById(R.id.option_name);
TextView templateDesc = (TextView) convertView.findViewById(R.id.option_info);
SwitchCompat optionSwitch = convertView.findViewById(R.id.optionSwitch);

name = option.getOptionName();
String description = option.getOptionDesc();

templateName.setText(name);
templateDesc.setText(description);

power = template.getTemplatePower();
enable = template.getTemplateStatus();

// Sets switches to their database values
switch (option) {
case TEMPLATEPOWER:
if (power == 0) {
optionSwitch.setChecked(false);
}

else {
optionSwitch.setChecked(true);
}
break;
case TEMPLATEENABLED:
if (enable == 0) {
optionSwitch.setChecked(false);
}

else {
optionSwitch.setChecked(true);
}
break;
}

// Monitors changing of switches and sets objects to be saved.

optionSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
checked = true;
switch (option) {
case TEMPLATEPOWER:
template.setTemplatePower(1);
Log.i("power", "power setting to 1" + "");
Log.i("enable", "enable dosnt change" + "");
break;
case TEMPLATEENABLED:
template.setTemplateStatus(1);
Log.i("power", "power dosnt change" + "");
Log.i("enable", "enable setting to 1" + "");
break;
}
} else {
checked = false;
switch (option) {
case TEMPLATEPOWER:
template.setTemplatePower(0);
Log.i("power", "power setting to 1" + "");
Log.i("enable", "enable dosnt change" + "");
break;
case TEMPLATEENABLED:
template.setTemplateStatus(0);
Log.i("power", "power dosnt change" + "");
Log.i("enable", "enable setting to 0" + "");
break;
}
}
}

});

viewTemplate.setTemplate(template);
return convertView;
}

Wow, wenn du immer noch bei mir bist, danke!

Okay, also das Problem zur Hand.

Wenn ich wieder in dem Fragment bin, das die Listenansicht enthält, wenn ich auf eine Schaltfläche zum Speichern klicke: Egal, was ich ein-, ausschalten oder aktivieren möchte, die Aktivierungsoption ist der einzige Wert, der sich ändert. Beispielsweise:

  • Wenn ich die Stromversorgung auf aktiviere, wird enable stattdessen aktiviert.
  • Wenn ich die Stromversorgung ausschalte, wird stattdessen aktiviert.

In meiner switch-Anweisung wird also der Fall TEMPLATEPOWER nie gesehen, obwohl es eine der Optionen ist.

Ich bin ein Anfänger Android Entwickler, ich bin mir sicher, das ist ein Fehler in meiner Logik, ich kann einfach nicht sehen, wo!

Jeder Rat wäre toll, Danke!

Wenn Sie mehr Klärung benötigen, fragen Sie einfach :)

Antworten:

0 für die Antwort № 1

Es mag bessere Wege geben, diese ganze Funktion auszuführen, aber nach stundenlangem Versuch, meinen Fall zu beheben, habe ich etwas geschafft.

Wo ich die Objektoption mit der Listenposition im Adapter bekommen habe, hätte ich sie auf final setzen sollen, da sie den Wert ständig ändert.

Ich habe mich verändert:

option = templateList.get(position);

Zu:

final Option option = templateList.get(position);