現在、ExpandableListViewの作成で問題が発生しています。現在何が起こっているのかわかりませんが、私がやろうとしていることを説明します。
私はプログラムで特定の日に当たる食事を割り当てます。各食事(タイトルはグループ)の中には、投票と注文のボタンを含む子供がいます。食事を注文すると、どちらも「注文済み」に変更されます。別の注文が行われると、前の注文ボタンは「注文」状態に戻り、選択されたボタンは注文済みになります。これは投票についても同じです。これについては、他のすべてのボタンをループするボタンにオンクリックリスナーを設定し、それらのテキストを「order」/「vote」に設定し、現在のボタンのテキストをorderedに設定します。
これは非常にまれなケースでは正常に機能しますが、ほとんどの場合、アイテムを注文/投票すると、選択したアイテムが「注文済み」に変更され、展開可能なリストビューの最後の要素も注文済みに変更されます。次に、注文した場合、たとえば3番目の要素を閉じてから再度開くと、2番目の要素も注文済みに変更され、その逆も同様です。場合によっては、すべてが注文に戻ったり、すべてが注文に変更されたりします。なぜこれが起こっているのかを理解するのは難しいと感じています。
getChildView関数と関係があるのではないかと思います。各要素を開いてリストをトラバースすると、適切なデータが割り当てられていても、最後の要素にビューが設定されることはありません。
ExpandableListViewの主要な概念を誤解していますか、それとも他に何かありますか。
これが、障害がある可能性があると私が信じているgetChildView関数です。以下に、他の関連するクラスへのリンクも提供します。さらに詳しい情報が必要な場合は、遠慮なくお問い合わせください。
//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(BaseExpandableListAdapterを拡張および拡張します)
ExpandListAdapter(BaseExpandableListAdapterを拡張します)
VoteOnClick(投票が成功したときにボタンテキストの変更を実装するクラス)