ExpandableListView - बिना बच्चों वाले समूहों के लिए संकेतक छिपाएं


108

एक में ExpandableListView, वहाँ एक रास्ता नहीं बच्चों के साथ समूहों के लिए समूह सूचक को छिपाने के लिए है?


1
स्पष्ट करने के लिए: क्या समूह संकेतक को छिपाने का एक तरीका है केवल उन समूहों के लिए जिनके पास कोई बच्चे नहीं हैं?
अल्लेओप 28

जवाबों:


111

यह कोशिश >>>

सभी वस्तुओं के लिए

 getExpandableListView().setGroupIndicator(null);

Xml में

android:groupIndicator="@null"

40
मुझे विश्वास है कि सभी वस्तुओं के लिए ग्रुपइंडिएटर सेट किया जाएगा और न केवल बच्चों के बिना।
एरिकोसग

4
परीक्षण किया और काम नहीं करता है। इस सरल छिपाने वाले सभी संकेतकों में या तो बच्चे हैं या नहीं।
frusso

2
myExpandableListView.setGroupIndicator (शून्य); मेरे लिए काम करता है
रंजीथ कुमार

@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>

यदि आप एक्सपेंडेबल लाइस्टऐक्टिविटी का उपयोग कर रहे हैं, तो आप इस प्रकार से ग्रुपइन्केटर को ऑनक्रिएट में सेट कर सकते हैं:

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

मैंने काम करने के लिए यह परीक्षण किया है।


36
काम नहीं कर रहा है: Android 4.0.2 (ICS) में परीक्षण किया गया। इस पेज पर इस सवाल के अन्य जवाब देखें। ऐसा लगता है कि Android संयुक्त राष्ट्र के विस्तारित समूह को खाली मानता है। बस समूह संकेतक को पारदर्शी पर सेट करें, फिर अपनी समूह पंक्ति में एक छवि दृश्य जोड़ें और एडाप्टर के गेटग्रुप दृश्य विधि में, इसे उस आइकन पर सेट करें जिसे आप चाहते हैं।
फ्रैगल

1
यह कोड मुझे या तो काम नहीं करता है (एंड्रॉइड 4.4 पर परीक्षण किया गया है) ।Unexpanded समूह को खाली (कोई बच्चे नहीं) माना जाता है, इसलिए आइकन रंग / पारदर्शी पर सेट है।
ग्विकारा

1
कोड के लिए धन्यवाद, लेकिन यह एक मजाक जैसा लगता है: इतने सरल काम के लिए इतना जटिल कोड?
एंटोनियो सेस्टो

1
इस जवाब पर विश्वास करना मुश्किल है कि इतने सारे 'उपयोगी' और एक इनाम प्राप्त हुए, जबकि यह दस्तावेज है कि ध्वस्त किए गए समूहों को प्रदर्शन कारणों से खाली माना जाता है!
3c71

41

StrayPointer के उत्तर और ब्लॉग के कोड के आधार पर, आप कोड को और भी सरल बना सकते हैं:

अपने xml में विस्तार योग्य सूची में फोलोइंग जोड़ें:

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 चयनकर्ता की भी आवश्यकता नहीं है। सभी जावा के माध्यम से किया जाता है।

साथ ही, यह दृष्टिकोण सही संकेतक भी दिखाता है जब एक समूह डिफ़ॉल्ट रूप से विस्तारित होता है जो ब्लॉग से कोड के साथ काम नहीं करता है।


4
यह getGroupView()आपके BaseExpandableListAdapterकार्यान्वयन की विधि में उपयोग करने के लिए है। इस उदाहरण के कार्यान्वयन पर एक नज़र डालें ।
jenzz

5
@ जेनज़ "संकेतक" क्या है?
आईबुनि

वह ViewHolderपैटर्न का उपयोग करता है। indicatorदृश्य धारक का चर नाम है।
गुयारा

सूचक एक छवि है। वह छवि जिसे आप राज्यों के आधार पर प्रदर्शित करना चाहते हैं
ओजोनुगा जुड ओचलिफु

संकेतक group_row xml में </ x? : layout_width = "20px" android: id = "@ + id / explist_indicator" android: src = "@ drawable / Expander_group" /> <TextView android: Layout_height = "wra -content" android: layout_width = "fill_parent" android: id = " @ + id / groupname "android: paddingLeft =" 30px "android: textStyle =" bold "android: textSize =" 16px "/> </ LinearLayout>
Razvan_TK9693

26

जैसा कि एक अलग उत्तर में उल्लेख किया गया है, चूंकि एंड्रॉइड एक अन-एक्सपेंडेड लिस्ट ग्रुप को खाली मानता है, इसलिए आइकॉन को ड्रा नहीं किया जाता है, भले ही ग्रुप में बच्चे हों।

इस लिंक ने मेरे लिए समस्या हल कर दी: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

मूल रूप से आपको डिफॉल्ट ड्रॉबल को पारदर्शी के रूप में सेट करना होगा, ड्रॉबल को इमेज व्यू के रूप में अपने ग्रुप व्यू में ले जाएं और अपने एडॉप्टर में इमेज को टॉगल करें।


12

अपने कोड में बस समूह सूची के लिए कस्टम एक्सएमएल का उपयोग करें और है कि में डाल imageView के लिए GroupIndicator

और नीचे दिए गए सरणियों को अपने एक्सपेंडेबल लाइस्ट एडेप्टर में जोड़ें

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) विस्तार योग्य एडाप्टर में:

@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

बस मिहिर त्रिवेदी के जवाब पर सुधार करना चाहते थे। आप इसे 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>

क्या आप अपना एक्सपेंडेबल लाइस्ट कोड भी पोस्ट कर सकते हैं? यह मेरे लिए काम नहीं कर रहा है (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>

अंत में, आप अपने एडॉप्टर क्लास में सिर्फ गेटग्रुप व्यू पद्धति को अपडेट करें:

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
यह सिर्फ सभी मदों को हटाता है: सूची खाली है -> मैं उदास है :(
इच

क्या आपने काउंटर चेक जोड़ा है? अगर (getChildrenCount (groupPosition) == 0) {
वडिम विकुलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.