Расширяемый список просмотра Перемещение группы значок значок вправо
Что касается расширяемого вида списка, значок значка группы расположен слева, можно ли переместить индикатор и поместить его вправо? Спасибо.
EDITED:. Поскольку я не хочу расширять представление, я получил это решение для получения ширины динамически. Просто поделитесь своим решением.
Display newDisplay = getWindowManager().getDefaultDisplay();
int width = newDisplay.getWidth();
newListView.setIndicatorBounds(width-50, width);
Ответы
Ответ 1
Согласно исходному коду ExpandableListView
, единственным способом перемещения индикатора в правую сторону является изменение его границ с помощью метода ExpandableListView.setIndicatorBounds()
. Вы можете вычислить связанный метод onSizeChanged()
, например.
Ответ 2
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);
}
}
Ответ 3
Лучший способ сделать это ниже, но не для всех версий 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());
}
});
Ответ 4
Все 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
И тебе хорошо идти!
Ответ 5
Я попытался использовать 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;
}
С помощью этого метода вы можете правильно отрегулировать положение значка развернуть/свернуть.
надеюсь, что это поможет.
Ответ 6
Expandable list view move group icon indicator to right
setIndicatorBounds(int left, int right)
используется для установки границ индикатора для группового представления вида expandable
.
explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));
Здесь ширина означает ширину устройства.
/Convert pixel to dip
public int GetDipsFromPixel(float pixels)
{
// Get the screen 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 method
. Здесь, в моем фрагменте, это 35.Другая мудрая иконка нарушена.
Для более подробной информации вы можете посетить здесь
https://developer.android.com/reference/android/widget/ExpandableListView.html#setIndicatorBounds(int, целое)
https://developer.android.com/reference/android/widget/ExpandableListView.html#setIndicatorBoundsRelative(int, целое)
Ответ 7
FIX:
Они ввели новый метод в API 18 и далее, метод, называемый setIndicatorBoundsRoundsative (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));
}
Ответ 8
если он находится во Фрагменте - onViewCreated()
ViewTreeObserver vto = Expnlist.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Expnlist.setIndicatorBounds(Expnlist.getMeasuredWidth() - 80, Expnlist.getMeasuredWidth());
}
});
его работы для меня!.
Ура!
Ответ 9
Введите этот код в Расширяемый базовый адаптер.
@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;
}
Ответ 10
setIndicatorBounds(int left, int right)
используется для установки границ индикатора для группового представления ExpandableListView
.
explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));
Здесь ширина означает ширину устройства.
Преобразование пикселя в окунуться:
public int GetDipsFromPixel(float pixels){
// Get the screen density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
return (int) (pixels * scale + 0.5f);
}
Ответ 11
Нашел этот способ, чтобы получить индикатор с правой стороны.
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/expandableListView"
android:indicatorLeft="320dp" />
Ответ 12
Я использую следующий короткий фрагмент, вдохновленный этот пример, для которого требуются две возможности рисования в папке:
if (isExpanded) {
ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.up, 0);
} else {
ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.down, 0);
}
В любом случае мне пришлось принять goodKode решение, чтобы "избавиться" от стандартных стрелок.
Итак, я бы посоветовал придерживаться простого ранее предложенного решения, поскольку это самый минималистский и точный подход.
Ответ 13
Попробуйте это...
этот код для настройки индикатора группы 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 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]()