Расширяемый вид списка переместить значок группы индикатор вправо
что касается расширяемого списка, индикатор значка группы расположен слева, могу ли я переместить индикатор и расположить его справа? Спасибо.
редактировать: так как я не хочу расширять представление, я получил этот обходной путь получения ширины динамически. Просто делюсь своим решением.
Display newDisplay = getWindowManager().getDefaultDisplay(); int width = newDisplay.getWidth(); newListView.setIndicatorBounds(width-50, width);
16 ответов:
По данным
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, поэтому используйте 2-й или третий метод, указанный ниже
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()); }
переместит этот индикатор вправо от списка просмотра даже на устройстве и на вкладке также.
или вы можете сделать это в потоке postdelayed.
(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; }
С помощью этого метода вы можете правильно настроить положение значка развернуть/свернуть. надеюсь, это поможет.
напишите этот код в расширяемом базовом адаптере.
@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; }
- элемент списка
Expandable list view move group icon indicator to right
The
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'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 method
. Вот в моем фрагменте это 35.Другой мудрый икона нарушается. Для более подробной информации вы можете посетить здесь
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)); }
если он находится в Fragment-onViewCreated ()
ViewTreeObserver vto = Expnlist.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Expnlist.setIndicatorBounds(Expnlist.getMeasuredWidth() - 80, Expnlist.getMeasuredWidth()); } });
это работает для меня!. Ура!
нашел этот способ, чтобы получить индикатор на правой стороне.
<ExpandableListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/expandableListView" android:indicatorLeft="320dp" />
The
setIndicatorBounds(int left, int right)
используется для установки границ индикатора для группового представленияExpandableListView
.explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));
здесь ширина означает ширину устройства.
конвертировать пиксель в 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); }
Я использую следующую короткую пьесу, вдохновленную этот пример для этого требуется два чертежа в папке:
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" в расширяемом listview, как показано ниже:
затем в макете заголовка, как показано ниже:
<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); }
результат..