ExpandableListView - ẩn chỉ báo cho các nhóm không có trẻ em


108

Trong an ExpandableListView, có cách nào để ẩn chỉ báo nhóm cho các nhóm không có con?


1
Để làm rõ: Có cách nào để ẩn chỉ báo nhóm CHỈ cho các nhóm không có trẻ em không?
AlleyOOP

Câu trả lời:


111

Hãy thử cái này >>>

cho tất cả các mặt hàng

 getExpandableListView().setGroupIndicator(null);

Trong xml

android:groupIndicator="@null"

40
Tôi tin rằng điều đó sẽ thiết lập groupIndicator cho tất cả các mục chứ không chỉ những mục không có trẻ em.
ericosg

4
Đã kiểm tra và không hoạt động. Đơn giản này ẩn tất cả các chỉ số hoặc có con hoặc không.
frusso

2
myExpandableListView.setGroupIndicator (null); làm việc cho tôi
Ranjith Kumar

@ericosg có cách nào ẩn chỉ báo cho nhóm không có con không ??
KJEjava48

1
Nó ẩn tất cả các chỉ số không phải là không có con.
Sam

88

Các android:groupIndicator bất động sản có thể vẽ trạng thái kích hoạt. Đó là, bạn có thể đặt hình ảnh khác nhau cho các trạng thái khác nhau.

Khi nhóm không có con, trạng thái tương ứng là 'state_empty'

Xem các liên kết tham khảo sau:

cái nàycái này

Đối với state_empty , bạn có thể đặt một hình ảnh khác mà không gây nhầm lẫn hoặc, chỉ cần sử dụng màu trong suốt để không hiển thị gì ...

Thêm mục này trong trạng thái có thể vẽ của bạn cùng với những người khác ....

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

Vì vậy, danh sách thống kê của bạn có thể như thế này:

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

Trong trường hợp bạn đang sử dụng ExpandableListActivity, bạn có thể đặt bộ chỉ mục nhóm trong onCreate như sau:

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

Tôi đã thử nghiệm điều này để làm việc.


36
Không hoạt động: Đã thử nghiệm trong Android 4.0.2 (ICS). Xem các câu trả lời khác cho câu hỏi này trên trang này. Có vẻ như Android coi nhóm chưa được mở rộng là trống. Chỉ cần đặt chỉ báo nhóm thành trong suốt, sau đó thêm imageView vào hàng nhóm của bạn và trong phương thức getGroupView của bộ điều hợp, đặt nó thành biểu tượng bạn muốn.
Fraggle

1
Mã này cũng không hoạt động ở dạng tôi (được thử nghiệm trên Android 4.4). Nhóm không mở rộng được coi là trống (không có trẻ em) vì vậy biểu tượng được đặt thành màu / trong suốt.
Guicara

1
Cảm ơn vì mã, nhưng nó trông giống như một trò đùa: mã quá phức tạp cho một nhiệm vụ đơn giản như vậy?
Antonio Sesto

1
Thật khó tin câu trả lời này lại nhận được rất nhiều 'hữu ích' và tiền thưởng trong khi có tài liệu cho rằng các nhóm bị sập được coi là trống vì lý do hiệu suất!
3c71,

41

Dựa trên câu trả lời của StrayPointer và mã từ blog, bạn có thể đơn giản hóa mã hơn nữa:

Trong xml của bạn, thêm phần sau vào ExpandableListView:

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

Sau đó trong Bộ điều hợp bạn làm như sau:

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

Bằng cách sử dụng phương thức setImageResource, bạn sẽ hoàn thành tất cả với một lớp lót. Bạn không cần ba mảng Số nguyên trong bộ điều hợp của mình. Bạn cũng không cần bộ chọn XML cho trạng thái được mở rộng và thu gọn. Tất cả được thực hiện thông qua Java.

Ngoài ra, cách tiếp cận này cũng hiển thị chỉ báo chính xác khi một nhóm được mở rộng theo mặc định, những gì không hoạt động với mã từ blog.


4
Điều này có nghĩa là được sử dụng trong getGroupView()phương pháp BaseExpandableListAdaptertriển khai của bạn . Hãy xem triển khai ví dụ này .
jenzz

5
@jenzz "Chỉ báo" là gì?
IBunny

Anh ấy sử dụng ViewHolderkhuôn mẫu. indicatorlà tên biến của người giữ khung nhìn.
Guicara

chỉ là một hình ảnh Imageview.The bạn muốn hiển thị dựa trên các tiểu bang
Ojonugwa Jude Ochalifu

chỉ báo đề cập đến Hình ảnh explist_indicator trong group_row xml: <? xml?> <LinearLayout android: orient = "ngang" 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

Như đã đề cập trong một câu trả lời khác, vì Android coi nhóm danh sách chưa mở rộng là trống, nên biểu tượng sẽ không được vẽ ngay cả khi nhóm có trẻ em.

Liên kết này đã giải quyết vấn đề cho tôi: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Về cơ bản, bạn phải đặt có thể vẽ mặc định là trong suốt, di chuyển có thể vẽ vào chế độ xem nhóm của bạn dưới dạng ImageView và chuyển đổi hình ảnh trong bộ điều hợp của bạn.


12

Trong mã của bạn, chỉ cần sử dụng xml tùy chỉnh cho danh sách nhóm và trong đó đặt ImageView cho GroupIndicator .

Và Thêm các mảng bên dưới vào ExpandableListAdapter của bạn

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

cũng trong phương thức của ExpandableListAdapter thêm những thứ tương tự như bên dưới

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

Tham khảo: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html


10

Trong XML

android:groupIndicator="@null"

Trong ExpandableListAdapter-> getGroupViewsao chép mã sau

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
Làm thế nào để sử dụng DEFAULT có thể kéo được? Nó cho biết: Không thể giải quyết biểu tượng 'nhóm lên'
StNickolay


4

gợi ý cho bạn giải pháp của tôi:

1) Xóa nhóm mặc định

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

Chỉ muốn cải thiện câu trả lời của Mihir Trivedi. Bạn có thể đặt cái này trong getGroupView () bên trong lớp 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]);
            }
        }
    }

... và đối với chế độ xem bố cục, đây là cách group_items.xml của tôi xuất hiện

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

Hy vọng điều đó sẽ giúp ... nhớ để lại ủng hộ


1

Sử dụng điều này, nó hoàn toàn làm việc cho tôi.

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

Bạn cũng có thể đăng mã ExpandableListView của mình không? Điều này không hiệu quả với tôi (group_indicator xuất hiện cho các nhóm có và không có trẻ em).

1

Bạn đã thử thay đổi ExpandableListViewthuộc tính của android:groupIndicator="@null"chưa?


0

Đơn giản, bạn tạo một bố cục xml mới với height = 0 cho tiêu đề nhóm ẩn. Ví dụ: đó là '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>

Sau đó, bố cục tiêu đề nhóm bình thường của bạn là '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>

Cuối cùng, bạn chỉ cần cập nhật phương thức getGroupView trong Lớp tiếp hợp của mình:

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

QUAN TRỌNG : Thẻ gốc của các tệp bố cục (ẩn và bình thường) phải khác nhau (như ví dụ trên, LinearLayout và RelativeLayout)


-3

convertView.setVisibility (View.GONE) nên thực hiện thủ thuật.

@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
Điều này chỉ xóa tất cả các mục: Danh sách trống -> tôi buồn :(
Ich

bạn đã thêm kiểm tra bộ đếm chưa? if (getChildrenCount (groupPosition) == 0) {
Vadym Vikulin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.