ExpandableListView - sembunyikan indikator untuk grup tanpa anak


108

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


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"

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.


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.


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.


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


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

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


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


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>

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


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)


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

3
Ini hanya menghapus semua item: Daftar kosong -> saya sedih :(
Ich

sudahkah Anda menambahkan cek counter? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.