ExpandableListView - ซ่อนตัวบ่งชี้สำหรับกลุ่มที่ไม่มีลูก


108

ในการExpandableListViewจะมีวิธีที่จะซ่อนตัวบ่งชี้กลุ่มสำหรับกลุ่มที่มีเด็กไม่ได้หรือไม่


1
ชี้แจง: มีวิธีซ่อนตัวบ่งชี้กลุ่มเฉพาะสำหรับกลุ่มที่ไม่มีเด็กหรือไม่?
AlleyOOP

คำตอบ:


111

ลองดู >>>

สำหรับรายการทั้งหมด

 getExpandableListView().setGroupIndicator(null);

ใน xml

android:groupIndicator="@null"

40
ฉันเชื่อว่าจะตั้ง groupIndicator สำหรับรายการทั้งหมดไม่ใช่เฉพาะผู้ที่ไม่มีลูก
ericosg

4
ทดสอบแล้วไม่ได้ผล ง่ายๆนี้ซ่อนตัวบ่งชี้ทั้งหมดว่ามีลูกหรือไม่
frusso

2
myExpandableListView.setGroupIndicator (null); ทำงานให้ฉัน
Ranjith Kumar

@ericosg มีวิธีใดในการซ่อนตัวบ่งชี้สำหรับกลุ่มที่ไม่มีลูก ??
KJEjava48

1
มันซ่อนตัวบ่งชี้ทั้งหมดไม่ใช่ตัวบ่งชี้ที่ไม่มีลูก
แซม

88

android:groupIndicatorคุณสมบัติใช้รัฐเปิดการใช้งาน drawable นั่นคือคุณสามารถตั้งค่ารูปภาพที่แตกต่างกันสำหรับสถานะต่างๆ

เมื่อกลุ่มไม่มีลูกสถานะที่เกี่ยวข้องคือ '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 คุณสามารถตั้งค่า groupindicator ใน 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

1
ยากที่จะเชื่อว่าคำตอบนี้ได้รับ 'มีประโยชน์' มากมายและได้รับรางวัลมากมายในขณะที่มีการบันทึกไว้ว่ากลุ่มที่ยุบถือว่าว่างเปล่าเนื่องจากเหตุผลด้านประสิทธิภาพ!
3c71

41

จากคำตอบของ StrayPointer และรหัสจากบล็อกคุณสามารถลดความซับซ้อนของโค้ดได้มากขึ้น:

ใน xml ของคุณเพิ่ม folowing ใน 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 "indicator" คืออะไร?
IBunny

เขาใช้ViewHolderแพทเทิร์น indicatorคือชื่อตัวแปรของตัวยึดมุมมอง
Guicara

ตัวบ่งชี้คือ Imageview ภาพที่คุณต้องการแสดงตามรัฐ
Ojonugwa Jude Ochalifu

ตัวบ่งชี้หมายถึง Explist_indicator Imageview ใน group_row xml: <? 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

โดยทั่วไปคุณต้องตั้งค่าเริ่มต้น drawable เป็นโปร่งใสย้าย drawable ไปยังมุมมองกลุ่มของคุณเป็น ImageView และสลับรูปภาพในอะแดปเตอร์ของคุณ


12

ในรหัสของคุณเพียงแค่ใช้ XML แบบกำหนดเองสำหรับรายชื่อกลุ่มและในการที่ใส่ImageViewสำหรับ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


11

ใน 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 drawables ได้อย่างไร? ข้อความระบุว่า: ไม่สามารถแก้ไขสัญลักษณ์ 'group-up'
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 คุณสามารถวางสิ่งนี้ภายใน getGroupView () ที่อยู่ในคลาส MyExpandableListAdapter

    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

เพียงแค่คุณสร้างเลย์เอาต์ xml ใหม่ที่มี height = 0 สำหรับส่วนหัวของกลุ่มที่ซ่อนอยู่ ตัวอย่างเช่น '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

คุณได้เพิ่มการตรวจสอบเคาน์เตอร์หรือไม่ ถ้า (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.