Android:如何更改可扩展列表视图指示器的位置?

9
我想改变ExpandableListView组视图中默认箭头的位置。我希望它在右边而不是左边。
这该如何实现?
5个回答

29

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

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

  2. <?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>
    

    请看TextView右侧的ImageView

  3. 按以下方式编辑您的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;
    }
    

    正如你所看到的,你可以轻松地设置与组状态相对应的可绘制对象。

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


在可扩展列表视图中,您要在指示器标记中放置什么? - Maxrunner
6
android:groupIndicator="@null" - Benoit Duffez
@NagarjunaReddy:对不起,你说什么? - Benoit Duffez
1
@Bicou 看一下这个:https://dev59.com/c2Up5IYBdhLWcg3wHkyo - NagarjunaReddy

9

使用setIndicatorBounds

设置指示器的绘制范围(至少,组指示器受此影响;如果将子指示器边界设置为继承,则子指示器也受此影响)。


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

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

-3

没有直接的方法来实现这个。

mIndicatorLeft和mIndicatorRight是ExpandableListView类中处理指示器图标位置的两个字段,它们是私有字段。不幸的是,指示器的位置并没有像预期的那样在一个明确定义的布局中设置,而是在ExpandableListView的dispatchDraw()方法中确定的。使用top/bottom和mIndicatorRight和mIndicatorLeft值绘制一个矩形,指示器图标在这个矩形中绘制。您必须更改名为“indicatorRect”的此矩形对象的位置以移动指示器图标。

为了了解事情的情况,您可以查看此示例http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html。在示例中的getGenericView()方法中将textView padding的值更改为0,您会发现指示器将重叠文本。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接