【问题标题】:ExpandableListView - group indication is stretch to fit the text sizeExpandableListView - 组指示被拉伸以适合文本大小
【发布时间】:2012-01-03 00:15:13
【问题描述】:

我有带有小图标的组指示,我使用 groupIndicator 调用选择器来绘制它,但我看到 android 默认拉伸该图标以适合文本大小

如何防止这种行为,并以原始大小显示图标?

【问题讨论】:

    标签: android expandablelistview


    【解决方案1】:

    无论您使用什么图像作为组指示符,都将其设为 9 块 (xxx.9.png) 图像,并将其可拉伸区域设置为围绕边框像素(可能是透明的)。它将防止从中间拉伸图像。

    【讨论】:

      【解决方案2】:
      <ExpandableListView 
          android:layout_height="fill_parent"
          android:layout_width="fill_parent"
          android:id="@+id/elv_store_info_Expandlist"
          android:cacheColorHint="#FFFFFF"
          android:overScrollMode="never"
          android:fastScrollEnabled="false"
          android:fastScrollAlwaysVisible="false"
          android:indicatorRight="20dp"
          android:divider="@android:color/transparent"
          android:dividerHeight="0dp"
          android:groupIndicator="@drawable/store_info_expandabellist_indicator"
          />
      

      @store_info_expandabellist_indicator.xml

      <?xml version="1.0" encoding="utf-8"?>
      <selector xmlns:android="http://schemas.android.com/apk/res/android">
      <item  android:state_empty="true" android:drawable="@drawable/bitmap_btn_arraw_right_dark_small">
      </item>
      <item android:state_expanded="true" android:drawable="@drawable/bitmap_btn_arraw_bottom_white_small">
      </item>
      <item android:drawable="@drawable/bitmap_btn_arraw_right_dark_small">
      </item>
      </selector>
      

      @bitmap_btn_arraw_right_dark_small

       <?xml version="1.0" encoding="utf-8"?>
       <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
       <item 
          android:left="11dp"
          android:right="11dp"
          android:top="12dp"
          android:bottom="12dp"
          android:drawable="@drawable/btn_arrowright_dark">
       </item>
       </layer-list>
      

      【讨论】:

        【解决方案3】:

        您可以通过 setGroupIndicator 方法添加组指标。但默认情况下,Android 会拉伸指示器的高度以适应组项的高度。 (宽度可以通过setIndicatorBounds方法调整。) 因此,您应该使组指示器的高度与组项的高度完全相同。 (见ExpandableListView

        否则,您可以使用 onGroupCollapsedonGroupExpanded 方法制作完全自定义的组指示器。只需创建一个具有某些状态的视图,当调用这些方法时,更改视图的状态。 (见ExpandableListAdapter

        【讨论】:

          【解决方案4】:

          我认为在这种情况下最简单的做法是将指示器包含在行组视图中(作为 imageView),并根据组是否展开来更改其选定状态。您需要确保您的 ImageView 使用具有选定状态可绘制对象的选择器。

          类似这样的:

              @Override
              public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
              {
                  View row;
          
                  if (convertView != null)
                  {
                      row = convertView;
                  }
                  else
                  {
                      row = LayoutInflater.from(getContext()).inflate(R.layout.group_row, null));
                  }
          
          
                  final ImageView indicator = (ImageView)row.findViewById(R.id.indicator);
                  indicator.setSelected(isExpanded);
                  return row;
              }
          

          【讨论】:

          • 这是最好的答案
          • if (isExpanded) { ivIndicator.setImageResource(R.drawable.ic_expended); } else { ivIndicator.setImageResource(R.drawable.collapsed); }
          【解决方案5】:

          chitacan 感谢您的评论。很有帮助!

          但是,如果您像我一样尝试在 onGroupExpanded 和 onGroupCollapsed 方法中更改组视图中的视图(例如指示器),您最终会发现它们会变回原来的状态。原因:exp.listview在展开折叠后调用getGroupView。如果您在那里生成视图而不是将它们保存在某个地方,那么一切都将从头开始生成。因此,您可以使用 isExpanded 参数简单地更改 getGroupView 方法中的视图(指标)。希望这会有所帮助,并且您不会像我一样浪费太多时间。在这种情况下,您将不需要 onGroupCollapsed 和 onGroupExpanded 方法。

          【讨论】:

          • 我可能会在 xml 中为展开和折叠状态定义指示器图标,并将这个可绘制的 xml 设置为组指示器。 schemas.android.com/apk/res/android">
          • 这太复杂了,而 Inherently Curious 的答案是正确的方法
          【解决方案6】:

          首先感谢 coderat。你的回答对我帮助很大。我最近想出了如何不仅可以解决拉伸问题,而且还可以解决当 groupItem 的高度大于可绘制对象时可绘制对象与底部/顶部对齐的问题。我只是稍微更改了 9patch。此图像也适用于所有屏幕密度(您不必为每个可绘制文件夹(hdpi、mdpi、...)创建一个缩放的 9patch)。希望有帮助;)

          【讨论】:

            【解决方案7】:

            是Expandable List View右侧指标图标的实现。 它对我有用。

            <ExpandableListView
                android:id="@+id/expandlv"
                        android:layout_height="match_parent"
                        android:layout_width="match_parent"
                        android:dividerHeight="2dp"
                        android:groupIndicator="@drawable/group_indicator"
                        android:divider="@andorid:color/white"/>
            

            group_indicator.xml

            <?xml version="1.0" encoding="utf-8"?>
            <selector xmlns:android="http://schemas.android.com/apk/res/android">
                <!--<item android:state_empty="true" android:drawable="@drawable/expanded_icon" />-->
                <!--<item android:state_expanded="true" android:drawable="@drawable/collapsed_icon" />-->
                <!--<item android:drawable="@drawable/expanded_icon"/>-->
            
            
                <item android:state_empty="true">
                    <layer-list>
                        <item
                            android:left="0dp"
                            android:right="3dp"
                            android:top="20dp"
                            android:bottom="20dp"
                            android:drawable="@drawable/expanded_icon">
                        </item>
                    </layer-list>
                </item>
            
                <item android:state_expanded="true">
                    <layer-list>
                        <item
                            android:left="0dp"
                            android:right="3dp"
                            android:top="20dp"
                            android:bottom="20dp"
                            android:drawable="@drawable/collapsed_icon">
                        </item>
                    </layer-list>
                </item>
            
            </selector>
            

            在java源代码中,

            DisplayMetrics metrics = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int width = metrics.widthPixels;
            
            expListView.setIndicatorBounds(width - GetDipsFromPixel(30), width - GetDipsFromPixel(6));
            expListView.setAdapter(listAdapter);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-31
              • 2015-09-16
              • 1970-01-01
              相关资源
              最近更新 更多