开发者

Android: how to change the position of ExpandableListView Indicator?

I want to change the position of the default arrow that appears in the Group view of the ExpandableListView. I want it to be to the right instead of being to the le开发者_如何学JAVAft.

how can this be done ?


Actually there is a simple way.

  1. Edit your XML related to the group view like this:

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

    See how the ImageView is on the right of the TextView.

  2. Edit your ExpandableListAdapter as follows:

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

    As you can see you can easily set the drawable corresponding to the group state.

I know the question was asked a long time ago, but this may help somebody.


Use setIndicatorBounds:

Sets the drawing bounds for the indicators (at minimum, the group indicator is affected by this; the child indicator is affected by this if the child indicator bounds are set to inherit).


Try this

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

And the GetDipsFromPixel is here

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


Android: how to change the position of ExpandableListView Indicator?

if you want to change the position indicator from the left to right side you need to add android:layoutDirection= "rtl". but the position of list change to the right side.

the example code is look like this

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


There is no direct way to do this.

mIndicatorLeft and mIndicatorRight are the two fields in ExpandableListView class that handle the location of the indicator icon and they are private fields. Unfortunately the position of indicator is not set in a neatly defined Layout as expected, but is determined on dispatchDraw() in the ExpandableListView. A rectangle is drawn using the top/bottom and the mIndicatorRight and mIndicatorLeft values, the indicator icon is drawn in this Rect. You must change the position of this Rect obj named 'indicatorRect' to move your indicator icon.

To get an idea of things you can see this example http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.html Change the value of textView padding to 0 in getGenericView() in the example, you will see that the indicator will overlap the text.

Your only option is to get the source code of ExpandableListView and set these mIndicatorRight and mIndicatorLeft values yourself by setting the mIndicatorRight as item.getRight() and mIndicatorLeft as item.getRight() - 'your icon size'.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜