展開可能なリストビューに関して、グループアイコンインジケーターは左側に配置されていますが、インジケーターを移動して右側に配置できますか?ありがとう。
編集:ビューを拡張したくないので、幅を動的に取得するこの回避策があります。ソリューションを共有するだけです。
Display newDisplay = getWindowManager()。getDefaultDisplay(); int width = newDisplay.getWidth(); newListView.setIndicatorBounds(width-50、width);
ExpandableListView
のソースコードによると、インジケーターを右側に移動する唯一の方法は、ExpandableListView.setIndicatorBounds()
メソッドを使用して境界を変更することです。たとえば、onSizeChanged()
メソッドで境界を計算できます。
setIndicatorBounds(int、int)は、Android 4.3。では正しく機能しません。新しいメソッドを導入しましたsetIndicatorBoundsRelative(int、int) 4.3で問題ありません。
@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 Versionではありません。
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);
}
FYI:幅は、setBoundsメソッドで指定された幅と同じです。このスニペットでは35です。それ以外の場合、アイコンが乱れています。詳細については、こちらをご覧ください。
このコードをExpandable Baseアダプターで記述します。
@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());
}
});
それは私のために働く!。乾杯!
私はそれが遅すぎることを知っていますが、ここでは、プログラムでシンプルで使いやすいインジケーターを適切に配置するソリューションがあります:
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
です
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);
}
これは私のために働いた
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);
}
最初に、以下のように展開可能なリストビューで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));
}
このサンプル に触発された以下の短いピースを使用しています。これには、フォルダーに2つのドロウアブルが必要です。
if (isExpanded) {
ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.up, 0);
} else {
ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.down, 0);
}
とにかく、デフォルトの矢印を「取り除く」ために goodKodeのソリューション を採用する必要がありました。
そのため、これまでに提供された最もシンプルで正確なアプローチなので、以前に提供されたシンプルなソリューションに固執することをお勧めします。