Exibição de lista expansível do Android - onClickListener para botões dentro do filho com estados persistentes

Atualmente estou tendo um problema com a criação do meu ExpandableListView. Não tenho certeza do que está acontecendo no momento, mas vou explicar o que estou tentando fazer.

Eu programaticamente alocar refeições que caem em um determinado dia. Dentro de cada refeição (o título é o grupo) é uma criança que contém um botão de votação e ordem. Ambos são alterados para "Ordenado" quando um pedido é feito em uma refeição. Se outro pedido for feito, o botão de pedido anterior volta ao estado 'pedido' e o selecionado é ordenado. Isto é o mesmo para o voto. Eu vou sobre isso, definindo um ouvinte no clique para meus botões que percorrer todos os outros botões e definir o seu texto para 'ordem' / 'votar' e definir o texto dos botões atuais para ordenada.

Isso funciona bem em alguns casos extremamente raros - mas na maioria das vezes quando eu ordeno / voto para um item, ele muda o item selecionado para 'ordenado' e o último elemento na minha exibição de lista expansível para ordenado também. Então, se eu pedir, digamos que o terceiro elemento, fechar e reabrir o segundo elemento, ele também muda para ordenada e vice-versa. Às vezes, todos eles mudam de volta para o pedido ou todos mudam para pedidos. Estou achando difícil descobrir por que isso pode estar acontecendo.

Eu acredito que pode ter algo a ver com a função getChildView. Quando eu atravesso a lista de abertura de cada elemento, a vista nunca é definida para o último elemento, mesmo que tenha sido alocado os dados apropriados.

Eu estou entendendo mal um conceito importante do ExpandableListView ou há algo mais.

Aqui está a função getChildView que acredito que possa haver uma falha. Também fornecerei links para as outras classes relevantes abaixo. Se você precisar de mais informações, não hesite em perguntar.

//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 (estende e extende meu BaseExpandableListAdapter)

ExpandListAdapter (estende o BaseExpandableListAdapter)

VoteOnClick (Classe que implementa a mudança do texto do botão quando um voto bem sucedido foi colocado)

questionAnswers(1)

yourAnswerToTheQuestion