【问题标题】:ExpandableListView - How to set divider only between parent elementsExpandableListView - 如何仅在父元素之间设置分隔符
【发布时间】:2011-07-14 14:34:23
【问题描述】:

我只想在父元素之间放置分隔符。当我设置

android:divider="@drawable/divider"
android 在父元素之间创建分隔符,但也在子元素之间创建分隔符。当我添加
android:childDivider="@color/transparent"
android 删除子元素之间的分隔符,但它们之间的可用空间仍然存在。为什么? 我试过
android:dividerHeight="0dp"
但什么也没发生。

我想在父元素之间设置分隔符,但我不想在子元素之间设置任何分隔符或空白。

有什么想法吗??

【问题讨论】:

    标签: android parent expandablelistview divider


    【解决方案1】:

    为了仅从子视图中删除分隔线,而不是在可扩展列表中的父视图之间删除分隔线:

    在 XML 的 ExapandableListView 属性中添加 android:childDivider="#00000000"

    <ExpandableListView
        android:id="@+id/elv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:childDivider="#00000000" />
    

    更多信息请参考this page

    【讨论】:

    • 这是迄今为止在浏览 50 个 SO 页面后解决我的问题的唯一评论
    【解决方案2】:

    为 Divider 颜色及其高度(当组折叠时,dividers 将可见)

    <ExpandableListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:divider="@color/color_black"
            android:dividerHeight="1dp"
            android:groupIndicator="@null" />
    

    【讨论】:

    • 设置高度对我来说比你成功!
    【解决方案3】:

    诀窍是为折叠组布局和最后一个子布局创建一个额外的view

    collapse_group.xml:

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent">
    
        <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textSize="17sp"/>
    
        <!-- this is the extra view-->  
        <View 
           android:layout_width="fill_parent"
           android:layout_height="10dp"
           android:background="@android:color/transparent"/>        
    
    </LinearLayout>
    

    expanded_group.xml:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent">
    
        <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textSize="17sp"/>
    
        <!-- no extra view-->       
    
    </LinearLayout>
    

    对子视图应用相同的技术,为最后一个子视图插入额外的视图

    【讨论】:

    • 这简直太完美了!
    • 或者也许不是创建两个单独的视图,而是在不需要时将可见性设置为 View.GONE 以用于分隔视图
    • 完美,但是如何将您的“额外视图”移动到 collapse_group.xml 的顶部并将其隐藏在第一行中。我试过了,它对我有用。
    【解决方案4】:

    我所做的是将 ExpandableListView 的分隔符设置为 0,然后将“分隔符”组插入它的 ExpandableListAdapter:

    // To get dividers between the groups we add 'divider views' as if they were  
    // themselves groups.
    public int getGroupCount() {
    // Actual groups are at even groupPositions, dividers at odd
        return (this.data.size() * 2) - 1;
    }
    
    public long getGroupId(int groupPosition) {
        if(groupPosition % 2 != 0) return R.id.divider;
        else return R.id.group;
    }
    
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        if(groupPosition % 2 != 0) {
            View divider = convertView;
            if(divider == null || divider.getId() != R.id.divider) {
                divider = this.inflater.inflate(R.layout.divider, null);
            }
    
            return divider;
        }
    
        View group = convertView;
        if(group == null || group.getId() != R.id.group) {
            group = this.inflater.inflate(R.layout.group, null);
        }
    
        return group;
    }
    

    【讨论】:

      【解决方案5】:
      expListView.setDividerHeight(10);
      expListView.setChildDivider(getResources().getDrawable(
                  android.R.color.white));
      

      【讨论】:

        【解决方案6】:

        如果您只想删除子分隔符,一个简单的技巧是您可以创建一个与您的子项的背景颜色相同颜色的可绘制对象。然后将其设置为子分隔符。

        ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
            sd1.getPaint().setColor(YOUR CHILD ITEM BACKGROUND COLOR);
            mExpListView.setChildDivider(sd1);
        

        或者使用xml:

        android:childDivider="@color/child_bg_color"
        

        【讨论】:

          【解决方案7】:

          如果您想在 ExpandableListView (Header) 的父元素之间有分隔线,并且不想在 children 和 parent 之间有分隔线,这显然是最自然的情况,那么您必须执行以下操作:

          1. 在您的父 xml 文件中,在布局底部添加一个视图,其中包含您需要的分隔线高度和分隔线颜色。 示例:

          2. 在子 xml 文件中执行相同操作。在布局底部添加一个视图,其中包含您需要的分隔线高度和分隔线颜色。确保分隔线的颜色和高度与父 xml 中的相同。

          3. 进入您的 ExpandableListView 适配器方法 公共视图 getGroupView(int groupPosition, boolean isExpanded, 查看 convertView、ViewGroup 父级) 像这样管理视图分隔线的状态: 示例:

            如果(已扩展){ headerDividerView.setBackgroundColor(ContextCompat.getColor(context,R.color.darker_grey)); }别的{ headerDividerView.setBackgroundColor(ContextCompat.getColor(context,android.R.color.transparent)); }

          顺便说一句:在我的情况下,R.color.darker_grey 是父级的背景颜色

          1. 从您的 ExpandableListView xml 中删除所有分隔线和分隔线高度。使 ExpandableListView 没有分隔线和分隔线高度。 您可以像这样使用 attrs:

            android:groupIndicator="@null" android:childIndicator="@null" android:divider="@null" android:dividerHeight="0dp"

          【讨论】:

            【解决方案8】:

            我通过添加两个视图来解决这个问题,一个是标题,另一个是子项,如下所示。

            头文件.xml

            <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            
            <RelativeLayout
            android:id="@+id/rl_header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/square_box"
            android:padding="@dimen/padding_10">
            
            <ImageView
                android:id="@+id/expandableIndicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:src="@drawable/ic_downarrow" />
            </RelativeLayout>
            
            <View
            android:id="@+id/view_hidden"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_below="@+id/rl_header"
            android:background="@android:color/transparent" />
            </RelativeLayout>
            

            child.xml

            <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            
            <RelativeLayout
            android:id="@+id/rl_childView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/square_box"
            android:padding="@dimen/padding_10">
            
            <TextView
                android:id="@+id/tv_startDate"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_centerVertical="true"
                android:gravity="left"
                android:paddingTop="@dimen/padding_5"
                android:paddingBottom="@dimen/padding_5"
                android:text="Start Date \nSep. 23, 2019"
                android:textSize="@dimen/text_16" />
            
            <ImageView
                android:id="@+id/iv_arrow"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:src="@drawable/right_arrow" />
            </RelativeLayout>
            
            <View
                android:id="@+id/view_hidden"
                android:layout_width="match_parent"
                android:layout_height="10dp"
                android:layout_below="@+id/rl_childView"
                android:background="@android:color/transparent" />
            </RelativeLayout>
            

            现在将此代码添加到您的适配器类。这个想法是在组展开/折叠时显示/隐藏视图,在子项上显示。

            @Override
            public View getGroupView(int listPosition, boolean isExpanded, View convertView, 
            ViewGroup parent) {
            String listTitle = (String) getGroup(listPosition);
            String listCount = "(" + getChildrenCount(listPosition) + ")";
            
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) 
            this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.expandable_header, null);
            }
            View view_hidden = convertView.findViewById(R.id.view_hidden);
            
            if (isExpanded) {
                view_hidden.setVisibility(View.GONE);
            } else {
                view_hidden.setVisibility(View.VISIBLE);
            }
            
            return convertView;
            }
            
            @Override
            public View getChildView(int listPosition, final int expandedListPosition,
                                 boolean isLastChild, View convertView, ViewGroup parent) {
            final Medication medication = (Medication) getChild(listPosition, 
            expandedListPosition);
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) 
            this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.expandable_item, null);
            }
            
            View view_hidden = convertView.findViewById(R.id.view_hidden);
            if (isLastChild) {
                view_hidden.setVisibility(View.VISIBLE);
            } else {
                view_hidden.setVisibility(View.GONE);
            }
            
            return convertView;
            }
            

            【讨论】:

              【解决方案9】:

              像这样设置android:divider="@null"父母没有分隔符android:divider="2dp"为父母设置分隔符

               <ExpandableListView
                      android:id="@+id/expandable_list"
                      android:layout_width="fill_parent"
                      android:layout_height="match_parent"
                      android:background="#ffffff"
                      android:divider="2dp"
                      android:groupIndicator="@drawable/group_indicator" />
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-02-03
                • 2016-08-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-10-29
                相关资源
                最近更新 更多