4

SimpleExpandableListAdapterを使用しようとしています。グループが展開されているかどうかにかかわらず、グループに異なるレイアウトが必要です。

グループに 2 つのレイアウトを渡すことができるコンストラクターがあります。

SimpleExpandableListAdapter(Context context,
 List<? extends Map<String, ?>> groupData,
 int expandedGroupLayout,
 int collapsedGroupLayout,
 String[] groupFrom,
 int[] groupTo,
 List<? extends List<? extends Map<String, ?>>> childData,
 int childLayout,
 String[] childFrom,
 int[] childTo)

2 つの異なるレイアウトを渡しますが、collapsedGroupLayout のみが表示されます。

誰もこれを機能させましたか?

ありがとう

4

2 に答える 2

3

SimpleExpandableListAdapter のソース コードを見たところ、バグがあるようです。

public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
        ViewGroup parent) {
    View v;
    if (convertView == null) {
        v = newGroupView(isExpanded, parent);
    } else {
        v = convertView;
    }
    bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo);
    return v;
}

convertView が null でない場合、リストビューがそのセルを再利用する場合、「isExpanded」パラメーターはまったく使用されないことがわかります。そのため、セルが表示されていてクリックされた場合、convertView はそのまま再利用され、他のレイアウトは使用されません。

私にとっての簡単な解決策は、毎回 getGroupView をオーバーライドして convertView に null を渡すことです。

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) {
        return super.getGroupView(groupPosition, isExpanded, null, parent);
    }

より良い解決策は、グループの位置とその状態のリストを保持し、状態が変更された場合に convertView を再利用しないことです。

于 2013-10-22T14:45:38.900 に答える
0

これを修正する別のアイデアを思いつきました。

次の getGroupView オーバーライドを使用しています。

public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                                 ViewGroup parent) {

    View v;

    if (convertView != null && ((Boolean) convertView.getTag()) == isExpanded) {
        v = super.getGroupView(groupPosition, isExpanded, convertView, parent);
    } else {
        v = super.getGroupView(groupPosition, isExpanded, null, parent);
        v.setTag(isExpanded);
    }

    return v;
}

これは、convertView のレイアウトが isExpanded パラメータに応じて異なる場合にのみ、強制的に新しいレイアウトを取得するという考え方です。2 つのビュー (展開と折りたたみ) が作成されると、Android は正しい convertView を再利用します。このアプローチの最大の問題は、ビューでタグを使用していることです。でも、私以外の人がタグを使わない限り、それでいいと思います。

お役に立てば幸いです。

于 2016-06-01T12:19:08.717 に答える