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)