ExpandableListView-子のないグループのインジケーターを非表示にします


108

ExpandableListView、子を持たないグループのグループインジケータを非表示にする方法はありますか?


1
明確にするために:子のいないグループに対してのみグループインジケーターを非表示にする方法はありますか?
AlleyOOP 2015

回答:


111

これを試してください>>>

すべてのアイテム

 getExpandableListView().setGroupIndicator(null);

XMLで

android:groupIndicator="@null"

40
これで、子供がいないものだけでなく、すべての項目にgroupIndicatorが設定されると思います。
ericosg 2013

4
テスト済みで動作しません。この単純な非表示は、すべてのインジケーターに子があるかどうかを示します。
frusso

2
myExpandableListView.setGroupIndicator(null); 私のために働く
Ranjith Kumar

@ericosg子のないグループのインジケータを非表示にする方法はありますか?
KJEjava48 2016

1
子のないインジケーターではなく、すべてのインジケーターを非表示にします。
Sam

88

android:groupIndicatorプロパティは、状態が有効描画可能になります。つまり、状態ごとに異なる画像を設定できます。

グループに子がない場合、対応する状態は「state_empty」です

以下の参照リンクを参照してください。

これこれ

ために state_empty、混乱しない別の画像を設定するか、単に透明色を使用して何も表示しないようにすることができます...

他の人と共にこのアイテムをステートフルドローアブルに追加してください。

<item android:state_empty="true" android:drawable="@android:color/transparent"/>

したがって、ステートリストは次のようになります。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_empty="true" android:drawable="@android:color/transparent"/>
    <item android:state_expanded="true" android:drawable="@drawable/my_icon_max" />
    <item android:drawable="@drawable/my_icon_min" />
</selector>

ExpandableListActivityを使用している場合は、次のようにonCreateでgroupindicatorを設定できます。

getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));

これが機能することをテストしました。


36
機能しない:Android 4.0.2(ICS)でテスト済み。このページでこの質問に対する他の回答を参照してください。Androidは展開されていないグループを空と見なしているようです。グループインジケーターを透明に設定してから、imageViewをグループ行に追加し、アダプターのgetGroupViewメソッドで、必要なアイコンに設定します。
Fraggle

1
このコードは私でも機能しません(Android 4.4でテスト済み)。展開されていないグループは空(子なし)と見なされるため、アイコンは色/透明に設定されます。
ガイカラ2014

1
コードをありがとう、しかしそれは冗談のように見えます:そのような単純なタスクのためのとても複雑なコード?
Antonio Sesto 2015

1
折りたたまれたグループはパフォーマンス上の理由から空であると見なされていることが文書化されている間、この回答が非常に多くの「有用な」と賞金を受け取ったとは信じがたいです。
3c71 '11年

41

StrayPointerの回答とブログのコードに基づいて、コードをさらに簡略化できます。

xmlで、以下をExpandableListViewに追加します。

android:groupIndicator="@android:color/transparent"

次に、アダプタで以下を実行します。

@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean){
    **...**

    if ( getChildrenCount( groupPosition ) == 0 ) {
       indicator.setVisibility( View.INVISIBLE );
    } else {
       indicator.setVisibility( View.VISIBLE );
       indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed );
    }
}

setImageResourceメソッドを使用すると、ワンライナーですべてを実行できます。アダプターに3つのInteger配列は必要ありません。また、展開および折りたたみ状態のXMLセレクターも必要ありません。すべてJava経由で行われます。

さらに、このアプローチでは、デフォルトでグループが展開されているときに、ブログのコードで機能しないものが正しいインジケーターを表示します。


4
これはgetGroupView()BaseExpandableListAdapter実装のメソッドで使用するためのものです。この実装例をご覧ください
jenzz 2013

5
@jenzz「指標」とは何ですか?
IBunny 2014年

彼はViewHolderパターンを使用しています。indicatorビューホルダーの変数名です。
ガイカラ2014

インジケーターはImageviewです。状態に基づいて表示する画像
Ojonugwa Jude Ochalifu

インジケーターは、group_row xmlのexplist_indicator Imageviewを参照します:<?xml?> <LinearLayout android:orientation = "horizo​​ntal" android:layout_height = "wrap_content" android:layout_width = "fill_parent"> <ImageView android:layout_height = "20px" android :layout_width = "20px" android:id = "@ + id / explist_indicator" android:src = "@ drawable / expander_group" /> <TextView android:layout_height = "wrap_content" android:layout_width = "fill_parent" android:id = " @ + id / groupname "android:paddingLeft =" 30px "android:textStyle =" bold "android:textSize =" 16px "/> </ LinearLayout>
Razvan_TK9692

26

別の回答で述べたように、Androidは展開されていないリストグループを空として処理するため、グループに子がある場合でもアイコンは描画されません。

このリンクは私のために問題を解決しました:http : //mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

基本的に、デフォルトのドローアブルを透明に設定し、ドローアブルをImageViewとしてグループビューに移動し、アダプターのイメージを切り替える必要があります。


12

コードでは、グループリストにカスタムxmlを使用し、その中にImageView for GroupIndicator配置します。

そして、以下の配列をExpandableListAdapterに追加します

private static final int[] EMPTY_STATE_SET = {};
private static final int[] GROUP_EXPANDED_STATE_SET = { android.R.attr.state_expanded };
private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0
GROUP_EXPANDED_STATE_SET // 1
};

ExpandableListAdapterのメソッドにも以下と同じものを追加します

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
{ 
    if (convertView == null) 
    {
        LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.row_group_list, null);
    }

    //Image view which you put in row_group_list.xml
    View ind = convertView.findViewById(R.id.iv_navigation);
    if (ind != null)
    {
        ImageView indicator = (ImageView) ind;
        if (getChildrenCount(groupPosition) == 0) 
        {
            indicator.setVisibility(View.INVISIBLE);
        } 
        else 
        {
            indicator.setVisibility(View.VISIBLE);
            int stateSetIndex = (isExpanded ? 1 : 0);
            Drawable drawable = indicator.getDrawable();
            drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
        }
    }

    return convertView;
}

リファレンス: http : //mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html


10

XMLで

android:groupIndicator="@null"

ExpandableListAdapter-> getGroupView次のコードをコピー

if (this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size() > 0){
      if (isExpanded) {
          arrowicon.setImageResource(R.drawable.group_up);
      } else {
          arrowicon.setImageResource(R.drawable.group_down);
      }
}

1
デフォルトのドローアブルを使用する方法?それは言う:シンボル「グループアップ」を解決できません
StNickolay


4

私の解決策を提案してください:

1)デフォルトのgroupIndicatorをクリアします。

<ExpandableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"       
    android:layout_width="wrap_content"
    android:layout_height="240dp"        
    android:layout_gravity="start"
    android:background="#cccc"  
    android:groupIndicator="@android:color/transparent"     
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"        
    android:dividerHeight="0dp"  
     />

2)ExpandableAdapter:

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = new TextView(context);
    }
    ((TextView) convertView).setText(groupItem.get(groupPosition));     
    ((TextView) convertView).setHeight(groupHeight);
    ((TextView) convertView).setTextSize(groupTextSize);

    //create groupIndicator using TextView drawable
    if (getChildrenCount(groupPosition)>0) {
        Drawable zzz ;
        if (isExpanded) {
            zzz = context.getResources().getDrawable(R.drawable.arrowup);
        } else {
            zzz = context.getResources().getDrawable(R.drawable.arrowdown);
        }                               
        zzz.setBounds(0, 0, groupHeight, groupHeight);
        ((TextView) convertView).setCompoundDrawables(null, null,zzz, null);
    }       
    convertView.setTag(groupItem.get(groupPosition));       

    return convertView;
}


2

Mihir Trivediの答えを改善したかっただけです。これをMyExpandableListAdapterクラス内のgetGroupView()内に配置できます

    View ind = convertView.findViewById(R.id.group_indicator);
    View ind2 = convertView.findViewById(R.id.group_indicator2);
    if (ind != null)
    {
        ImageView indicator = (ImageView) ind;
        if (getChildrenCount(groupPosition) == 0)
        {
            indicator.setVisibility(View.INVISIBLE);
        }
        else
        {
            indicator.setVisibility(View.VISIBLE);
            int stateSetIndex = (isExpanded ? 1 : 0);

            /*toggles down button to change upwards when list has expanded*/
            if(stateSetIndex == 1){
                ind.setVisibility(View.INVISIBLE);
                ind2.setVisibility(View.VISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
            else if(stateSetIndex == 0){
                ind.setVisibility(View.VISIBLE);
                ind2.setVisibility(View.INVISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
        }
    }

...そしてレイアウトビューに関しては、これは私のgroup_items.xmlがどのように見えるかです

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/group_heading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="20dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    android:textSize="15sp"
    android:textStyle="bold"/>

<ImageView
    android:id="@+id/group_indicator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_down_float"
    android:layout_alignParentRight="true"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

<ImageView
    android:id="@+id/group_indicator2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_up_float"
    android:layout_alignParentRight="true"
    android:visibility="gone"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

お役に立てれば幸いです...賛成票を残すことを忘れないでください


1

これを使用すると、私にとっては完全に機能します。

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/group_indicator_expanded" android:state_empty="false" android:state_expanded="true"/>
<item android:drawable="@drawable/group_indicator" android:state_empty="true"/>
<item android:drawable="@drawable/group_indicator"/>

</selector>

ExpandableListViewコードも投稿できますか?これは私にとっては機能しません(group_indicatorは子のあるグループとないグループに表示されます)。


0

単に、非表示のグループヘッダーの高さ= 0で新しいXMLレイアウトを作成します。たとえば、「group_list_item_empty.xml」です。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"              
              android:layout_width="match_parent"
              android:layout_height="0dp">
</RelativeLayout>

次に、通常のグループヘッダーレイアウトは「your_group_list_item_file.xml」です。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="48dp"
              android:orientation="horizontal">
    ...your xml layout define...
</LinearLayout>

最後に、アダプタクラスのgetGroupViewメソッドを更新するだけです。

public class MyExpandableListAdapter extends BaseExpandableListAdapter{   

    //Your code here ...

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
        if (Your condition to hide the group header){
            if (convertView == null || convertView instanceof LinearLayout) {
                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.group_list_item_empty, null);
            }           
            return convertView;
        }else{      
            if (convertView == null || convertView instanceof RelativeLayout) {
                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.your_group_list_item_file, null);              
            }   
            //Your code here ...
            return convertView;
        }
    }
}

重要:レイアウトファイルのルートタグ(非表示と通常)は異なる必要があります(上記の例のように、LinearLayoutとRelativeLayout)


-3

convertView.setVisibility(View.GONE)がうまくいくはずです。

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    DistanceHolder holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false);
        if (getChildrenCount(groupPosition)==0) {
            convertView.setVisibility(View.GONE);
        }

3
これはすべての項目を削除するだけです。リストは空です->私は悲しいです:(
Ich

カウンターチェックを追加しましたか?if(getChildrenCount(groupPosition)== 0){
Vadym Vikulin 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.