ExpandableListView-자식이없는 그룹에 대한 표시기 숨기기


108

에서 ExpandableListView하위가없는 그룹에 대해 그룹 표시기를 숨기는 방법이 있습니까?


1
명확히하기 위해 : 하위가없는 그룹에 대해서만 그룹 표시기를 숨기는 방법이 있습니까?
AlleyOOP

답변:


111

이것을보십시오 >>>

모든 항목

 getExpandableListView().setGroupIndicator(null);

XML에서

android:groupIndicator="@null"

40
나는 그것이 아이들이없는 것뿐만 아니라 모든 항목에 대해 groupIndicator를 설정할 것이라고 믿습니다.
ericosg 2013

4
테스트를 거쳐 작동하지 않습니다. 이 간단한 모든 지표 숨기기는 자식이 있거나 없습니다.
frusso

2
myExpandableListView.setGroupIndicator (null); 나를 위해 작동
란 지트 쿠마르

@ericosg 자식이없는 그룹에 대한 표시기를 숨기는 방법이 있습니까 ??
KJEjava48

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에서 그룹 표시기를 설정할 수 있습니다.

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

나는 이것이 작동하는지 테스트했습니다.


36
작동하지 않음 : Android 4.0.2 (ICS)에서 테스트되었습니다. 이 페이지에서이 질문에 대한 다른 응답을 참조하십시오. Android는 확장되지 않은 그룹을 빈 것으로 간주하는 것 같습니다. 그룹 표시기를 투명하게 설정 한 다음 그룹 행에 imageView를 추가하고 어댑터의 getGroupView 메서드에서 원하는 아이콘으로 설정하면됩니다.
Fraggle

1
이 코드는 나에게도 작동하지 않습니다 (Android 4.4에서 테스트 됨) 확장되지 않은 그룹은 빈 (자식 없음)으로 간주되어 아이콘이 색상 / 투명으로 설정됩니다.
Guicara

1
코드 고마워요,하지만 농담처럼 보입니다 : 그렇게 간단한 작업에 복잡한 코드인가요?
Antonio Sesto 2015

1
이 답변이 너무 많은 '유용함'과 현상금을 받았다는 것을 믿기 어렵지만 성능상의 이유로 무너진 그룹은 비어있는 것으로 간주됩니다!
3c71

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 메소드를 사용하면 한 줄로 모든 작업을 수행 할 수 있습니다. 어댑터에 세 개의 정수 배열이 필요하지 않습니다. 확장 및 축소 상태에 대한 XML 선택기도 필요하지 않습니다. 모두 Java를 통해 수행됩니다.

또한이 접근 방식은 블로그의 코드에서 작동하지 않는 그룹이 기본적으로 확장 될 때 올바른 표시기를 표시합니다.


4
이것은 구현 getGroupView()방법에 사용하기 BaseExpandableListAdapter위한 것입니다. 이것 좀 봐 예제 구현을 .
jenzz

5
@jenzz "표시기"는 무엇입니까?
아이 버니

그는 ViewHolder패턴을 사용합니다 . indicator뷰 홀더의 변수 이름입니다.
Guicara

표시기는 Imageview입니다. 상태에 따라 표시하려는 이미지
Ojonugwa Jude Ochalifu

표시기는 group_row xml의 explist_indicator Imageview를 참조합니다. <? xml?> <LinearLayout android : orientation = "horizontal"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을 사용하고 GroupIndicator 에 대한 ImageView 를 넣으십시오 .

그리고 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
DEFAULT 드로어 블을 사용하는 방법? 그것은 말한다 : '그룹 업'기호를 해결할 수 없음
StNickolay


4

내 해결책을 제안하십시오.

1) 기본 그룹 지우기 표시기 :

<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는 자녀가 있거나없는 그룹에 나타납니다).

1

ExpandableListView의 속성 을 변경하려고 했습니까 android:groupIndicator="@null"?


0

간단히, 숨겨진 그룹 헤더에 대해 height = 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.