확장 가능한 목록보기 그룹 아이콘 표시기를 오른쪽으로 이동
확장 가능한 목록보기의 경우 그룹 아이콘 표시기가 왼쪽에 있습니다. 표시기를 이동하여 오른쪽으로 배치 할 수 있습니까? 감사.
편집 됨 : 뷰를 확장하고 싶지 않기 때문에 너비를 동적으로 가져 오는이 해결 방법이 있습니다. 내 솔루션을 공유하는 것뿐입니다.
디스플레이 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);
}
결과는 ..
참고 URL : https://stackoverflow.com/questions/5800426/expandable-list-view-move-group-icon-indicator-to-right
'Programing' 카테고리의 다른 글
iPad의 현재 방향을 얻으시겠습니까? (0) | 2020.11.26 |
---|---|
.NET / C #의 사이트에서 이미지 다운로드 (0) | 2020.11.26 |
Ajax 게시물의 JQuery 확인 성공 (0) | 2020.11.26 |
자바의 희소 행렬 / 배열 (0) | 2020.11.25 |
CVS에서 Git으로의 마이그레이션 도구가 있습니까? (0) | 2020.11.25 |