ExpandableListView - alt öğesi olmayan gruplar için göstergeyi gizle


108

Bir In ExpandableListView, hiçbir çocuk grupları için grup göstergesini gizlemek için bir yol var?


1
Açıklığa kavuşturmak için: Grup göstergesini YALNIZCA çocuğu olmayan gruplar için gizlemenin bir yolu var mı?
AlleyOOP

Yanıtlar:


111

Bunu deneyin >>>

tüm öğeler için

 getExpandableListView().setGroupIndicator(null);

Xml olarak

android:groupIndicator="@null"

40
Bunun sadece çocuksuz olanlar için değil tüm öğeler için groupIndicator'ı ayarlayacağına inanıyorum.
ericosg

4
Test edildi ve çalışmıyor. Bu basit tüm göstergeleri gizleyin ya çocukları var ya da yok.
frusso

2
myExpandableListView.setGroupIndicator (boş); benim için çalışıyor
Ranjith Kumar

@ericosg çocuğu olmayan gruplar için göstergeyi gizlemenin bir yolu var mı ??
KJEjava48

1
Çocuğu olmayanları değil tüm göstergeleri gizler.
Sam

88

android:groupIndicatorTesiste durumunun etkin çekilebilir sürer. Yani, farklı durumlar için farklı görüntü ayarlayabilirsiniz.

Grubun çocuğu olmadığında, karşılık gelen durum 'state_empty'dir.

Şu referans bağlantılarına bakın:

bu ve bu

Çünkü state_empty, kafa karıştırıcı olmayan farklı bir görüntü ayarlayabilir veya hiçbir şey göstermemek için sadece şeffaf renk kullanabilirsiniz ...

Bu öğeyi başkalarıyla birlikte durumlu çekilebilir dosyanıza ekleyin ...

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

Dolayısıyla, istatistik listeniz şu şekilde olabilir:

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

Bir ExpandableListActivity kullanıyorsanız, grup göstergesini onCreate içinde aşağıdaki gibi ayarlayabilirsiniz:

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

Bunun çalıştığını test ettim.


36
Çalışmıyor: Android 4.0.2'de (ICS) test edildi. Bu sayfada bu soruya verilen diğer yanıtlara bakın. Görünüşe göre Android, genişletilmemiş grubu boş kabul ediyor. Grup göstergesini şeffaf olarak ayarlayın, ardından grup satırınıza bir imageView ekleyin ve adaptörün getGroupView yönteminde onu istediğiniz simgeye ayarlayın.
Fraggle

1
Bu kod benden de çalışmıyor (Android 4.4'te test edildi). Genişletilmemiş grup boş olarak kabul edilir (çocuksuz), bu nedenle simge renkli / şeffaf olarak ayarlanır.
Guicara

1
Kod için teşekkürler, ama şaka gibi görünüyor: bu kadar basit bir görev için çok karmaşık bir kod mu?
Antonio Sesto

1
Çöken grupların performans nedenlerinden ötürü boş kabul edildiği belgelenirken, bu cevabın bu kadar çok 'faydalı' ve ödül aldığına inanmak zor!
3c71

41

StrayPointer'ın cevabına ve blogdaki koda dayanarak kodu daha da basitleştirebilirsiniz:

Xml'nizde aşağıdakileri ExpandableListView'a ekleyin:

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

Ardından Adaptörde şunları yaparsınız:

@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 yöntemini kullanarak, hepsini tek bir satırla halledersiniz. Adaptörünüzde üç Tamsayı dizisine ihtiyacınız yoktur. Ayrıca, genişletilmiş ve daraltılmış durum için bir XML seçiciye ihtiyacınız yoktur. Hepsi Java ile yapılır.

Ayrıca bu yaklaşım, bir grup varsayılan olarak genişletildiğinde blogdaki kodla çalışmayan doğru göstergeyi de görüntüler.


4
Bu, uygulama getGroupView()yönteminizde kullanılmak üzere tasarlanmıştır BaseExpandableListAdapter. Bu örnek uygulamaya bir göz atın .
jenzz

5
@jenzz "Gösterge" nedir?
IBunny

O kullanmak ViewHolderdeseni. indicatorgörünüm sahibinin değişken adıdır.
Guicara

Gösterge bir Görüntü
Görünümüdür

gösterge group_row xml: <? xml?> <LinearLayout android: orientation = "horizontal" android: layout_height = "wrap_content" android: layout_width = "fill_parent"> <ImageView android: layout_height = "20px" android'deki explist_indicator Görüntü Görünümünü ifade eder : 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

Farklı bir yanıtta belirtildiği gibi, Android genişlemeyen bir liste grubunu boş olarak değerlendirdiğinden, grubun alt öğeleri olsa bile simge çizilmez.

Bu bağlantı benim için sorunu çözdü: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Temel olarak, varsayılan çekilebilirliği şeffaf olarak ayarlamanız, çekilebilirliği bir ImageView olarak grup görünümünüze taşımanız ve bağdaştırıcınızdaki resmi değiştirmeniz gerekir.


12

Kodunuzda sadece grup listesi için özel xml kullanmak ve bu koymak ImageView için GroupIndicator .

Ve ExpandableListAdapter'ınıza aşağıdaki dizileri ekleyin

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
};

Ayrıca ExpandableListAdapter yönteminde aşağıdaki gibi aynı şeyleri ekleyin

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;
}

Referans: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html


10

XML olarak

android:groupIndicator="@null"

İçinde ExpandableListAdapter-> getGroupViewaşağıdaki kodu kopyala

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
VARSAYILAN çekilebilir öğeler nasıl kullanılır? Diyor ki: 'Grup oluşturma' sembolü
çözülemiyor


4

size çözümümü öneriyorum:

1) Varsayılan grup Göstergesini temizle:

<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'da:

@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'nin cevabını geliştirmek istedim. Bunu MyExpandableListAdapter sınıfının içindeki getGroupView () içine yerleştirebilirsiniz.

    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]);
            }
        }
    }

... ve düzen görünümüne gelince, group_items.xml dosyam şöyle görünüyor

<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"/>

Umarım yardımcı olur ... olumlu oy bırakmayı unutmayın


1

Bunu kullanın, benim için mükemmel çalışıyor.

<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 kodunuzu da gönderebilir misiniz? Bu benim için çalışmıyor (group_indicator, çocuklu ve çocuksuz gruplar için görünür).

1

ExpandableListView'In özniteliğini değiştirmeyi denediniz android:groupIndicator="@null"mi?


0

Basitçe, gizli grup başlığı için yükseklik = 0 ile yeni bir xml düzeni oluşturursunuz. Örneğin, "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>

O zaman normal grup başlık düzeniniz 'grubunuz_listesi_item_dosyanız.xml'dir'

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

Son olarak, Adaptör Sınıfınızdaki getGroupView yöntemini güncellemeniz yeterlidir:

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;
        }
    }
}

ÖNEMLİ : Düzen dosyalarının kök etiketi (gizli ve normal) farklı olmalıdır (yukarıdaki örnekte olduğu gibi, LinearLayout ve RelativeLayout)


-3

convertView.setVisibility (View.GONE) hile yapmalı.

@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
Bu sadece tüm öğeleri kaldırır: Liste boş -> üzgünüm :(
Ich

sayaç kontrolü eklediniz mi? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.