Android Expandable List View - onClickListener für Schaltflächen im untergeordneten Element mit dauerhaften Status

Ich habe derzeit ein Problem mit der Erstellung meiner ExpandableListView. Ich bin mir nicht sicher, was gerade passiert, aber ich werde erklären, was ich versuche zu tun.

Ich teile Mahlzeiten programmatisch zu, die auf einen bestimmten Tag fallen. Innerhalb jeder Mahlzeit (der Titel ist die Gruppe) befindet sich ein Kind, das einen Abstimmungs- und Bestellknopf enthält. Beide werden in "Bestellt" geändert, wenn eine Bestellung für eine Mahlzeit erfolgt. Wenn eine andere Bestellung getätigt wird, kehrt die Schaltfläche "Vorherige Bestellung" in den Status "Bestellung" zurück und die ausgewählte Bestellung wird bestellt. Dies gilt auch für die Abstimmung. Um dies zu erreichen, setze ich einen On-Click-Listener auf meine Schaltflächen, der alle anderen Schaltflächen durchläuft, und setze deren Text auf 'order' / 'vote' und den aktuellen Schaltflächentext auf order.

Dies funktioniert in einigen extrem seltenen Fällen einwandfrei - aber wenn ich einen Artikel bestelle / abstimme, ändert sich meistens der ausgewählte in "bestellt" und das letzte Element in meiner erweiterbaren Listenansicht ebenfalls in "bestellt". Wenn ich dann bestelle, sagen wir das 3. Element, schließe das 2. Element und öffne es wieder. Es ändert sich ebenfalls in "bestellt" und umgekehrt. Manchmal ändern sich alle wieder in die Reihenfolge oder alle ändern sich in die Reihenfolge. Ich finde es schwierig herauszufinden, warum dies passieren kann.

Ich glaube, es kann etwas mit der getChildView-Funktion zu tun haben. Wenn ich durch die Liste gehe, die jedes Element öffnet, wird die Ansicht nie für das letzte Element festgelegt, obwohl ihm die entsprechenden Daten zugewiesen wurden.

Verstehe ich ein wichtiges Konzept der ExpandableListView falsch oder gibt es noch etwas anderes?

Hier ist die getChildView-Funktion, von der ich glaube, dass ein Fehler vorliegt. Ich werde auch Links zu den anderen relevanten Klassen unten liefern. Wenn Sie weitere Informationen benötigen, zögern Sie bitte nicht zu fragen.

//Static class view holder
static class ViewHolder {
    protected Button oBut;
    protected Button vBut;
    protected TextView description;
}

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    //Getting the appropriate child for the group and position
    ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);

    View view = null;

    //Set up if doesn't exist
    if (convertView == null) {
        Log.d("OnClickListener", "groupPosition: " + groupPosition + " childPosition: " + childPosition);
        Log.d("OnClickListener", "View being set up for: " + child.getName() + " desc: " + child.getDescription());

        LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        view = infalInflater.inflate(R.layout.expandlist_child_item_todays, null);

        //Attempt at viewholder
        final ViewHolder holder = new ViewHolder();
        holder.description = (TextView) view.findViewById(R.id.mealDescription);
        holder.vBut = (Button)view.findViewById(R.id.vote);
        holder.oBut = (Button)view.findViewById(R.id.order);

        view.setTag(holder);
    }
    else {
        view = convertView;
    }

    ViewHolder holder = (ViewHolder) view.getTag();

    holder.description.setText(child.getDescription());
    holder.description.setTag(child.getTag());

    holder.oBut.setOnClickListener(new OrderOnClick(groups, (Activity)context, holder.oBut, view, child));
    holder.vBut.setOnClickListener(new VoteOnClick(groups, (Activity)context, holder.vBut, view, child));

    return view;
}

Erweitern Sie ListAdapterTodays (erweitert und erweitert meinen BaseExpandableListAdapter)

Erweitern Sie ListAdapter (erweitert den BaseExpandableListAdapter)

VoteOnClick (Klasse, die das Ändern des Schaltflächentexts implementiert, wenn eine erfolgreiche Abstimmung erfolgt ist.)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage