Android:如何更改ExpandableListView指标的位置?

时间:2011-02-27 10:37:06

标签: android listview

我想更改ExpandableListView的“组”视图中显示的默认箭头的位置。我希望它在右边,而不是在左边。

怎么办呢?

5 个答案:

答案 0 :(得分:29)

实际上有一种简单的方法。

  1. 编辑与组视图相关的XML,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="35dp"
    android:orientation="horizontal" >
    
    <TextView
        android:id="@+id/videos_explist_groupname"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/videos_group_indicator"
        android:gravity="center"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textAppearance="?android:attr/textAppearanceListItem" />
    
    <ImageView
        android:id="@+id/videos_group_indicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/videos_chevron_collapsed" />
    
    </RelativeLayout>
    

    查看ImageView右侧的TextView

  2. 按如下方式修改ExpandableListAdapter

    @Override
    public View getGroupView(final int groupPosition, final boolean isExpanded, final View convertView, final ViewGroup parent) {
        View v;
        if (convertView == null) {
            v = newGroupView(isExpanded, parent);
        } else {
            v = convertView;
        }
        bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo);
        ((ImageView) v.findViewById(R.id.videos_group_indicator))
            .setImageResource(isExpanded?R.drawable.videos_chevron_expanded:R.drawable.videos_chevron_collapsed);
        return v;
    }
    

    如您所见,您可以轻松设置与组状态相对应的drawable。

  3. 我知道很久以前就问过这个问题,但这可能对某人有所帮助。

答案 1 :(得分:9)

使用setIndicatorBounds

  

设置指标的绘图范围(至少为组   指标受此影响;儿童指标受此影响   如果子指标边界设置为继承)。

答案 2 :(得分:6)

试试这个

expList = getExpandableListView();
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
//this code for adjusting the group indicator into right side of the view
expList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));

GetDipsFromPixel就在这里

public int GetDipsFromPixel(float pixels)
{
   // Get the screen's density scale
   final float scale = getResources().getDisplayMetrics().density;
   // Convert the dps to pixels, based on density scale
   return (int) (pixels * scale + 0.5f);
}

答案 3 :(得分:0)

enter image description here

如果要将位置指示器从左侧更改为右侧,则需要添加android:layoutDirection= "rtl"。但列表的位置更改到右侧。

示例代码如下

<ExpandableListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:layoutDirection="rtl"
    />

答案 4 :(得分:-3)

没有直接的方法可以做到这一点。

mIndicatorLeft和mIndicatorRight是ExpandableListView类中的两个字段,用于处理指示符图标的位置,它们是私有字段。遗憾的是,指标的位置未按预期在整齐定义的布局中设置,而是在ExpandableListView中的dispatchDraw()上确定。使用顶部/底部以及mIndicatorRight和mIndicatorLeft值绘制矩形,在此Rect中绘制指示符图标。您必须更改名为“indicatorRect”的Rect obj的位置以移动指示器图标。

要了解事情,您可以看到此示例http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html 在示例中的getGenericView()中将textView填充的值更改为0,您将看到指示符将与文本重叠。

您唯一的选择是获取ExpandableListView的源代码并通过将mIndicatorRight设置为item.getRight()并将mIndicatorLeft设置为item.getRight() - '您的图标大小'来自己设置这些mIndicatorRight和mIndicatorLeft值。