Programing

확장 가능한 목록보기 그룹 아이콘 표시기를 오른쪽으로 이동

crosscheck 2020. 11. 26. 07:52
반응형

확장 가능한 목록보기 그룹 아이콘 표시기를 오른쪽으로 이동


확장 가능한 목록보기의 경우 그룹 아이콘 표시기가 왼쪽에 있습니다. 표시기를 이동하여 오른쪽으로 배치 할 수 있습니까? 감사.

편집 됨 : 뷰를 확장하고 싶지 않기 때문에 너비를 동적으로 가져 오는이 해결 방법이 있습니다. 내 솔루션을 공유하는 것뿐입니다.

디스플레이 newDisplay = getWindowManager (). getDefaultDisplay (); 
int width = newDisplay.getWidth ();
newListView.setIndicatorBounds (width-50, width);

ExpandableListView의 소스 코드 에 따르면 표시기를 오른쪽으로 이동하는 유일한 방법은 ExpandableListView.setIndicatorBounds()메서드를 사용하여 경계를 변경하는 것입니다. onSizeChanged()예를 들어 바운드 인 방법을 계산할 수 있습니다 .


setIndicatorBounds (int, int) 는 Android 4.3에서 제대로 작동하지 않습니다. 그들은 4.3에서 잘 작동 하는 새로운 메소드 setIndicatorBoundsRelative (int, int)도입했습니다 .

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
       mExpandableListView.setIndicatorBounds(myLeft, myRight);
    } else {
       mExpandableListView.setIndicatorBoundsRelative(myLeft, myRight);
    }
}

이를 수행하는 가장 좋은 방법은 아래에 있지만 모든 Android 버전에는 적용되지 않으므로 아래 지정된 두 번째 또는 세 번째 방법을 사용하십시오.

ViewTreeObserver vto = mExpandableListView.getViewTreeObserver();

    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
                 mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth());
        }
    });

아니면 이거:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth());
} 

장치와 탭에서도 해당 표시기를 목록보기 오른쪽으로 이동합니다.

또는 지연된 스레드에서이를 수행 할 수 있습니다.

 (new Handler()).post(new Runnable() {

        @Override
        public void run() {
              mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth());
        }
    });

모든 XML 솔루션! 이 문제를 해결하는 더 좋은 방법을 찾았습니다. 이것은 디스플레이 메트릭을 엉망으로 만들 필요가 없으며 프로그래밍 방식으로 해킹 할 필요가 없습니다.

다음을 수행해야합니다.

1) 레이아웃 방향을 오른쪽에서 왼쪽으로 설정

<ExpandableListView
...
android:layoutDirection="rtl" />

2) 목록 항목 레이아웃에 다음이 포함되어 있는지 확인합니다 (예, 사용자 지정 레이아웃이 필요합니다).

android:gravity="left" //to adjust the text to align to the left again
android:layoutDirection="ltr"  //OR this line, based on your layout

그리고 당신은 갈 수 있습니다!


setIndicatorBounds 및 setIndicatorBoundsRelative를 사용하려고 시도했지만 아이콘이 예상대로 멋지게 표시되지 않습니다. 그래서 아래에 따라 코드를 변경합니다.

그룹 레이아웃 만들기 :

    <?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="48dp"
    android:background="@drawable/header_selector" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/ic_home" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/icon"
        android:gravity="center_vertical"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:paddingRight="40dp"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:textColor="@color/list_item_title" />

    <TextView
        android:id="@+id/counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginRight="8dp"
        android:background="@drawable/counter_bg"
        android:textColor="@color/counter_text_color" />

    <ImageView
        android:id="@+id/icon_expand"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="200dp"
        android:layout_toRightOf="@+id/counter"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/navigation_expand"
        android:visibility="visible" />

    <ImageView
        android:id="@+id/icon_collapse"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="200dp"
        android:layout_toRightOf="@+id/counter"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/navigation_collapse"
        android:visibility="gone" /> 

</RelativeLayout>

getGroupView 메서드 내부의 어댑터 클래스에서이 레이아웃 사용 :

 @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {

        NavDrawerItem itemHeader = (NavDrawerItem) getGroup(groupPosition);

        LayoutInflater inflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View view = null;
        if (convertView == null) {
            view = (View) inflater.inflate(R.layout.drawer_header_item, null);
        } else {
            view = convertView;
        }

        ImageView icon = (ImageView) view.findViewById(R.id.icon);

        if (itemHeader.isIconVisible()) {
            icon.setImageResource(itemHeader.getIcon());
        } else {
            icon.setVisibility(View.GONE);
        }

        TextView textTitle = (TextView) view.findViewById(R.id.title);
        textTitle.setText(" " + itemHeader.getTitle());

        TextView textCount = (TextView) view.findViewById(R.id.counter);

        if (itemHeader.getCounterVisibility()) {
            textCount.setText(itemHeader.getCount());
        } else {
            textCount.setVisibility(View.GONE);
        }

        ImageView iconExpand = (ImageView) view.findViewById(R.id.icon_expand);
        ImageView iconCollapse = (ImageView) view
                .findViewById(R.id.icon_collapse);

        if (isExpanded) {
            iconExpand.setVisibility(View.GONE);
            iconCollapse.setVisibility(View.VISIBLE);
        } else {
            iconExpand.setVisibility(View.VISIBLE);
            iconCollapse.setVisibility(View.GONE);
        }

        if (getChildrenCount(groupPosition) == 0) {
            iconExpand.setVisibility(View.GONE);
            iconCollapse.setVisibility(View.GONE);
        }

        return view;
    }

이 방법을 사용하면 확장 / 축소 아이콘의 위치를 ​​적절하게 조정할 수 있습니다. 도움이되기를 바랍니다.


확장 가능한 목록보기 그룹 아이콘 표시기를 오른쪽으로 이동

setIndicatorBounds(int left, int right)확장리스트 뷰의 그룹보기위한 지표 경계를 설정하기 위해 사용된다.

explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));
Here width means device width.

/Convert pixel to dip 
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);
} 

참고 : 너비가 setBounds 메서드에 지정된 너비와 같습니다 . 여기 내 스 니펫에서는 35이고 그렇지 않으면 아이콘이 방해받습니다. 자세한 내용은 여기를 참조하십시오.


확장 가능한 기본 어댑터에이 코드를 작성하십시오.

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    ImageView imgs;

    String headerTitle = (String) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView lblListHeader = (TextView) convertView
            .findViewById(R.id.lblListHeader);
     imgs = (ImageView) convertView
            .findViewById(R.id.img_list);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(headerTitle);
    if (isExpanded) {
  imgs.setImageResource(R.drawable.up_arrow);
    }
    else {
        imgs.setImageResource(R.drawable.downs_arrow);
    }

    return convertView;
}
  • 목록 항목

FIX: 

그들은 API 18 이상에서 setIndicatorBoundsRelative (int, int)라는 새로운 메소드를 도입했습니다. Android 버전을 확인하고 API와 함께 각각의 방법을 사용해야합니다.

expListView = (ExpandableListView) v.findViewById(R.id.laptop_list);

metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;

if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
    expListView.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));

} else {
    expListView.setIndicatorBoundsRelative(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));

}

조각에있는 경우-onViewCreated ()

    ViewTreeObserver vto = Expnlist.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new      ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Expnlist.setIndicatorBounds(Expnlist.getMeasuredWidth() - 80, Expnlist.getMeasuredWidth());
        }
    });

나를 위해 작동합니다!. 건배!


setIndicatorBounds(int left, int right)그룹보기에 대한 표시기 경계를 설정하는 데 사용됩니다 ExpandableListView.

explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));

여기서 너비는 장치 너비를 의미합니다.

픽셀을 딥으로 변환 :

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

폴더에 두 개의 드로어 블이 필요한 이 샘플에서 영감을 얻은 다음 짧은 부분을 사용하고 있습니다 .

if (isExpanded) {
    ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.up, 0);
} else {
    ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.down, 0);
} 

어쨌든, 기본 화살표를 "제거하기 위해" goodKode의 솔루션 을 채택해야했습니다 .

따라서 가장 미니멀하고 정확한 접근 방식이므로 이전에 제공된 간단한 솔루션을 고수하는 것이 좋습니다.


     DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int width = metrics.widthPixels; 

 mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list);
 mExpandableList.setIndicatorBounds(width - GetPixelFromDips(50), width - GetPixelFromDips(10));  

   public int GetPixelFromDips(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 : groupIndicator = "@ null"을 설정합니다.

그런 다음 헤더 레이아웃에서 아래와 같이 :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/screen_margin"
    android:paddingRight="@dimen/screen_margin"
    android:paddingTop="@dimen/dot_margin"
    android:paddingBottom="@dimen/dot_margin"
    android:orientation="vertical">




    <TextView
        android:id="@+id/tvQuestion"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="what is jodi?"
        android:textColor="@color/textColor"
        android:textSize="@dimen/font_large"
        app:customFont="@string/font_toolbar"
        android:layout_toLeftOf="@+id/imgDropDown"
        android:layout_marginRight="@dimen/margin"
       />


    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imgDropDown"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/right_arrow"/>

</RelativeLayout>

마지막으로 getGroupView 메소드에서 어댑터에 이것을 추가하십시오.

TextView lblListHeader = (TextView) convertView.findViewById(R.id.tvQuestion);

lblListHeader.setText(headerTitle);

ImageView img=convertView.findViewById(R.id.imgDropDown);

if (isExpanded) {
  img.setImageResource(R.drawable.down_arrow);
    lblListHeader.setTextColor(_context.getResources().getColor(R.color.colorPrimary));
} else {
 img.setImageResource(R.drawable.right_arrow);
    lblListHeader.setTextColor(_context.getResources().getColor(R.color.textColor));
}

너무 늦었지만 프로그래밍 방식으로 간단하고 사용하기 쉬운 표시기를 오른쪽에 배치하는 솔루션이 있습니다.

expandableListView = (ExpandableListView) findViewById(R.id.expandableListView);

        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;
        Resources r = getResources();
        int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                50, r.getDisplayMetrics());
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            expandableListView.setIndicatorBounds(width - px, width);
        } else {
            expandableListView.setIndicatorBoundsRelative(width - px, width);
        }

expandableListView어디 있어ExpandableListview


이 코드를 시도해보십시오. ExpandableList 그룹 표시기를 뷰의 오른쪽으로 조정하는 코드입니다.

private ExpandableListView expandableListView;
DisplayMetrics metrics;
int width;
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
expandableListView.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10));

이 메서드를 호출하면

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

결과는 .. ExpandableList right side group indicator

참고 URL : https://stackoverflow.com/questions/5800426/expandable-list-view-move-group-icon-indicator-to-right

반응형