Vista de lista expandible de Android - onClickListener para botones dentro del niño con estados persistentes

Actualmente tengo un problema con la creación de mi ExpandableListView. No estoy seguro de lo que está sucediendo en este momento, pero explicaré lo que estoy tratando de hacer.

Asigno programáticamente las comidas que caen en un día determinado. Dentro de cada comida (el título es el grupo) hay un niño que contiene un botón para votar y ordenar. Ambos se cambian a "Ordenados" cuando se realiza un pedido en una comida. Si se realiza otra orden, el botón de orden anterior vuelve al estado de 'orden' y el seleccionado se ordena. Esto es lo mismo para votar. Hago esto estableciendo un oyente al hacer clic en mis botones que recorren todos los demás botones y configuran su texto en 'ordenar' / 'votar' y configuran el texto actual de los botones en ordenado.

Esto funciona bien en algunos casos extremadamente raros, pero la mayoría de las veces cuando hago un pedido / voto para un elemento, cambia el seleccionado a 'ordenado' y el último elemento en mi vista de lista expandible a ordenado también. Luego, si ordeno, digamos que el tercer elemento, cierra y vuelve a abrir el segundo elemento, también cambia a ordenado y viceversa. A veces todos cambian de nuevo al orden o todos cambian a ordenado. Me resulta difícil entender por qué esto puede estar sucediendo.

Creo que puede tener algo que ver con la función getChildView. Como cuando atravieso la lista abriendo cada elemento, la vista nunca se configura para el último elemento aunque se hayan asignado los datos apropiados.

¿Estoy entendiendo mal un concepto importante de ExpandableListView o hay algo más?

Aquí está la función getChildView que creo que puede haber una falla. También proporcionaré enlaces a las otras clases relevantes a continuación. Si necesita más información, no dude en preguntar.

//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 (se extiende y se extiende fuera de mi BaseExpandableListAdapter)

ExpandListAdapter (extiende el BaseExpandableListAdapter)

VoteOnClick (Clase que implementa el cambio del texto del botón cuando se ha realizado una votación exitosa)

Respuestas a la pregunta(1)

Su respuesta a la pregunta