Widok rozwijanej listy Android - onClickListener dla przycisków wewnątrz dziecka z uporczywymi stanami

Obecnie mam problem z utworzeniem mojego ExpandableListView. Nie jestem pewien, co się dzieje w tej chwili, ale wyjaśnię, co próbuję zrobić.

Programowo przydzielam posiłki, które przypadają na określony dzień. W każdym posiłku (tytuł jest grupą) znajduje się dziecko, które zawiera przycisk głosowania i zamówienia. Oba są zmieniane na „Zamówione”, gdy zamówienie jest składane podczas posiłku. Jeśli zostanie wykonane inne zamówienie, przycisk poprzedniego zamówienia wraca do stanu „zamówienie”, a wybrany do zamówienia. To samo dotyczy głosowania. Zajmuję się tym, ustawiając odbiornik kliknięć na moich przyciskach, które przechodzą przez wszystkie inne przyciski i ustawiają tekst na „zamów” / „głosuj” i ustawiają tekst bieżących przycisków na uporządkowany.

Działa to dobrze w niektórych bardzo rzadkich przypadkach - ale przez większość czasu, kiedy zamawiam / głosuję na przedmiot, zmienia on wybrany na „zamówiony”, a ostatni element w moim rozwijanym widoku listy również zamawiam. Następnie, jeśli zamówię, powiedzmy, że trzeci element, zamknij i ponownie otwórz drugi element, zmienia się również na uporządkowany i odwrotnie. Czasami wszystkie zmieniają się z powrotem na zamówienie lub wszystkie zmiany na zamówione. Trudno mi zrozumieć, dlaczego tak się dzieje.

Wierzę, że może to mieć coś wspólnego z funkcją getChildView. Gdy przechodzę przez listę otwierającą każdy element, widok nigdy nie jest ustawiany dla ostatniego elementu, mimo że przydzielono mu odpowiednie dane.

Czy źle rozumiem główną koncepcję ExpandableListView, czy jest coś innego.

Oto funkcja getChildView, która moim zdaniem może być przyczyną błędu. Dostarczę również linki do innych odpowiednich klas poniżej. Jeśli potrzebujesz dodatkowych informacji, nie wahaj się zapytać.

//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;
}

ExpandListAdapterTodays (rozszerza i rozszerza mój BaseExpandableListAdapter)

ExpandListAdapter (rozszerza BaseExpandableListAdapter)

VoteOnClick (Klasa, która implementuje zmianę tekstu przycisku po pomyślnym głosowaniu)

questionAnswers(1)

yourAnswerToTheQuestion