2

現在、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(投票が成功したときにボタンテキストの変更を実装するクラス)

4

1 に答える 1

2

Androidのリストビューが効率的に機能する方法は、「ビューのリサイクル」方法を実装することです。この方法では、一部のビューが画面から消えた場合、同じビューが画面のどこかに戻され、必要なビットがすべて変更されます。これにより、使用するリソースがはるかに少なくなり、実際には同じリソースが再利用されますが、特定の順序で状態を維持する必要がある場合は、大混乱を招きます。あなたがすべきことは、オブジェクト上の位置がリストビューの位置に対応するある種のマップまたは配列リストを実装してから、作成されたオブジェクトを介して変更を加えることです。少し足りないですが、アダプタのアダプタ方式のようなものです。

onlickメソッドがどのように機能するかを正確に視覚化できないため、お詫び申し上げます。

for (int i = 0; i < groups.size(); i++) {
....
but.setText("Vote");

になります

ArrayList<String> group_string_states = new ArrayList<String> ();

private void fillGroupStringStates () {
        for(int i = 0; i < groups.length; i++) {
            group_string_states.add("Order");
        }
    }

....

for (int i = 0; i < group_string_states.size(); i++) {
....
group_string_states.set(i, "Vote");

次に、group_string_states.get [position]が「vote」と言った場合のように条件付きで実行し、次にこれを実行します。

まあ、それは私がそれをやろうとする方法です。お役に立てば幸いです。お役に立てなかった場合は本当に申し訳ありません。

于 2012-10-09T15:41:31.220 に答える