ExpandableListView - sembunyikan indikator untuk grup tanpa anak

108

Apakah ExpandableListViewada cara untuk menyembunyikan indikator kelompok untuk kelompok tanpa anak?

Gratzi
sumber
1
Untuk memperjelas: Apakah ada cara menyembunyikan indikator kelompok HANYA untuk kelompok tanpa anak?
AlleyOOP

Jawaban:

111

Coba ini >>>

untuk semua item

 getExpandableListView().setGroupIndicator(null);

Dalam xml

android:groupIndicator="@null"
Amt87
sumber
40
Saya percaya itu akan mengatur groupIndicator untuk semua item dan bukan hanya yang tanpa anak.
ericosg
4
Teruji dan tidak berhasil. Sederhana ini menyembunyikan semua indikator baik memiliki anak atau tidak.
frusso
2
myExpandableListView.setGroupIndicator (null); bekerja untuk saya
Ranjith Kumar
@ericosg adakah cara untuk menyembunyikan indikator untuk grup tanpa anak ??
KJEjava48
1
Itu menyembunyikan semua indikator, bukan yang tanpa anak.
Sam
88

The android:groupIndicatorproperti membutuhkan ditarik diaktifkan negara. Artinya, Anda dapat mengatur gambar yang berbeda untuk keadaan yang berbeda.

Jika grup tidak memiliki anak, status terkait adalah 'state_empty'

Lihat tautan referensi ini:

ini dan ini

Sebab state_empty, Anda dapat mengatur gambar berbeda yang tidak membingungkan, atau, cukup gunakan warna transparan untuk tidak menampilkan apa-apa ...

Tambahkan item ini di stateful drawable Anda bersama dengan item lain ....

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

Jadi, statelist Anda bisa seperti ini:

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

Jika Anda menggunakan ExpandableListActivity, Anda dapat menyetel indikator grup di onCreate sebagai berikut:

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

Saya telah menguji ini untuk bekerja.

Sarwar Erfan
sumber
36
Tidak berfungsi: Diuji di Android 4.0.2 (ICS). Lihat tanggapan lain untuk pertanyaan ini di halaman ini. Sepertinya Android menganggap grup yang tidak diperluas sebagai kosong. Cukup setel indikator grup menjadi transparan, lalu tambahkan imageView ke baris grup Anda dan dalam metode adaptor getGroupView, setel ke ikon yang Anda inginkan.
Fraggle
1
Kode ini juga tidak berfungsi dari saya (diuji pada Android 4.4). Grup yang tidak diperluas dianggap kosong (tidak ada anak) sehingga ikon disetel ke warna / transparan.
Guicara
1
Terima kasih untuk kodenya, tapi ini terlihat seperti lelucon: kode yang begitu rumit untuk tugas yang begitu sederhana?
Antonio Sesto
1
Sulit dipercaya, jawaban ini menerima begitu banyak 'berguna' dan hadiah sementara didokumentasikan bahwa grup yang runtuh dianggap kosong karena alasan kinerja!
3c71
41

Berdasarkan jawaban StrayPointer dan kode dari blog, Anda dapat lebih menyederhanakan kode tersebut:

Di xml Anda, tambahkan berikut ini ke ExpandableListView:

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

Kemudian di Adaptor Anda melakukan hal berikut:

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

Dengan menggunakan metode setImageResource, Anda menyelesaikan semuanya dengan satu baris. Anda tidak memerlukan tiga larik Integer di adaptor Anda. Anda juga tidak memerlukan pemilih XML untuk status diperluas dan diciutkan. Semua dilakukan melalui Java.

Plus, pendekatan ini juga menampilkan indikator yang benar ketika grup yang diperluas secara default yang tidak berfungsi dengan kode dari blog.

jenzz
sumber
4
Ini dimaksudkan untuk digunakan dalam getGroupView()metode BaseExpandableListAdapterpenerapan Anda . Lihat contoh implementasi ini .
jenzz
5
@jenzz Apa itu "indikator"?
IBunny
Dia menggunakan ViewHolderpolanya. indicatoradalah nama variabel pemegang tampilan.
Guicara
Indikator adalah Imageview. Gambar yang ingin Anda tampilkan berdasarkan negara bagian
Ojonugwa Jude Ochalifu
Indikator mengacu pada explist_indicator Imageview di group_row xml: <? xml?> <LinearLayout android: orientasi = "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

Seperti yang disebutkan dalam jawaban berbeda, karena Android memperlakukan grup daftar yang tidak diperluas sebagai kosong, ikon tidak digambar meskipun grup tersebut memiliki turunan.

Tautan ini memecahkan masalah bagi saya: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Pada dasarnya Anda harus menyetel drawable default sebagai transparan, memindahkan drawable ke tampilan grup Anda sebagai ImageView dan mengalihkan gambar di adaptor Anda.

StrayPointer
sumber
12

Dalam kode Anda, cukup gunakan xml khusus untuk daftar grup dan di situ letakkan ImageView untuk GroupIndicator .

Dan Tambahkan array di bawah ini di ExpandableListAdapter Anda

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

juga dalam metode ExpandableListAdapter menambahkan hal yang sama seperti di bawah ini

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

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

Mihir Trivedi
sumber
10

Dalam XML

android:groupIndicator="@null"

Di ExpandableListAdapter-> getGroupViewsalin kode berikut

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);
      }
}
Saurabh Agarwal
sumber
1
Bagaimana cara menggunakan drawable DEFAULT? Bunyinya: Tidak dapat menyelesaikan simbol '
pengelompokan
4

Sarankan solusi saya:

1) Hapus grup defaultIndikator:

<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) di 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;
}
Evgeny Karavashkin
sumber
@ stackoverflow.com/users/4090796/evgeny-karavashkin apa itu "arrowup"?
StNickolay
2

Hanya ingin memperbaiki jawaban Mihir Trivedi. Anda bisa menempatkan ini dalam getGroupView () yang ada di dalam kelas 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]);
            }
        }
    }

... dan untuk tampilan tata letak, ini adalah tampilan group_items.xml saya

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

Harapan yang membantu ... ingatlah untuk memberikan suara positif

keyboard_kracker22
sumber
1

Gunakan ini, ini bekerja dengan sempurna untuk saya.

<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>
Asad Rao
sumber
Bisakah Anda memposting kode ExpandableListView Anda juga? Ini tidak berfungsi untuk saya (group_indicator muncul untuk grup dengan dan tanpa anak).
1

Sudahkah Anda mencoba mengubah ExpandableListViewatribut android:groupIndicator="@null"?

Rajat Gupta
sumber
0

Sederhananya, Anda membuat tata letak xml baru dengan height = 0 untuk header grup tersembunyi. Misalnya, '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>

Kemudian tata letak header grup normal Anda adalah '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>

Terakhir, Anda baru saja memperbarui metode getGroupView di Kelas Adaptor Anda:

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

PENTING : Tag root dari file tata letak (tersembunyi dan normal) harus berbeda (seperti contoh di atas, LinearLayout dan RelativeLayout)

Tran Hieu
sumber
-3

convertView.setVisibility (View.GONE) harus melakukan triknya.

@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);
        }
Vadym Vikulin
sumber
3
Ini hanya menghapus semua item: Daftar kosong -> saya sedih :(
Ich
sudahkah Anda menambahkan cek counter? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin