En ce qui concerne la vue de liste extensible, l'indicateur d'icône de groupe est positionné à gauche, puis-je déplacer l'indicateur et le positionner à droite? Merci.
EDITED: Comme je ne veux pas étendre la vue, j'ai eu cette solution pour obtenir la largeur dynamiquement. Je partage juste ma solution.
Afficher newDisplay = getWindowManager (). GetDefaultDisplay (); int width = newDisplay.getWidth (); newListView.setIndicatorBounds (width-50, width);
Selon le code source de ExpandableListView
, la seule façon de déplacer un indicateur vers la droite est de changer ses limites en utilisant la méthode ExpandableListView.setIndicatorBounds()
. Vous pouvez calculer le lié dans la méthode onSizeChanged()
, par exemple.
setIndicatorBounds (int, int) ne fonctionne pas correctement pour Android 4.3. Ils ont introduit une nouvelle méthode setIndicatorBoundsRelative (int, int) qui fonctionne ok pour 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);
}
}
La meilleure façon de le faire est ci-dessous mais pas pour tous Android Version Utilisez donc la 2e ou la troisième méthode spécifiée ci-dessous
ViewTreeObserver vto = mExpandableListView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth());
}
});
ou ca:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth());
}
déplacera cet indicateur à droite de la vue de liste, même sur l'appareil et sur l'onglet également.
ou vous pouvez le faire dans un fil post-retardé.
(new Handler()).post(new Runnable() {
@Override
public void run() {
mExpandableListView.setIndicatorBounds(mExpandableListView.getRight()- 40, mExpandableListView.getWidth());
}
});
Toute solution XML! J'ai trouvé un meilleur moyen de résoudre ce problème. Cela ne vous oblige pas à jouer avec les mesures d'affichage, pas besoin de le pirater par programme.
Voici ce que vous devez faire:
1) définir la direction de la mise en page de droite à gauche
<ExpandableListView
...
Android:layoutDirection="rtl" />
2) assurez-vous que la disposition de votre élément de liste comprend cela (oui, vous aurez besoin d'une disposition personnalisée):
Android:gravity="left" //to adjust the text to align to the left again
Android:layoutDirection="ltr" //OR this line, based on your layout
Et vous êtes prêt à partir!
J'ai essayé d'utiliser setIndicatorBounds et setIndicatorBoundsRelative mais l'icône ne s'affiche pas aussi bien que prévu. Je change donc mon code comme ci-dessous:
créer une disposition de groupe:
<?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>
et en utilisant cette disposition dans la classe d'adaptateur à l'intérieur de la méthode 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;
}
Avec cette méthode, vous pouvez régler correctement la position de l'icône de développement/réduction. J'espère que ça aide.
La fonction setIndicatorBounds(int left, int right)
est utilisée pour définir les limites de l'indicateur pour la vue de groupe d'une vue de liste extensible.
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: La largeur est égale à la largeur spécifiée dans la méthode setBounds . Ici, dans mon extrait de code, c'est 35. Sinon, l'icône est perturbée. Pour plus de détails, vous pouvez visiter ici:
Écrivez ce code dans l'adaptateur de base extensible.
@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:
Ils ont introduit une nouvelle méthode dans l'API 18 et les suivantes, une méthode appelée setIndicatorBoundsRelative (int, int). Vous devez vérifier la version Android version et utiliser les méthodes respectives avec les 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));
}
s'il est dans Fragment - onViewCreated ()
ViewTreeObserver vto = Expnlist.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Expnlist.setIndicatorBounds(Expnlist.getMeasuredWidth() - 80, Expnlist.getMeasuredWidth());
}
});
ses travaux pour moi!. À votre santé!
je sais qu'il est trop tard mais voici une solution pour mettre l'indicateur à droite par programmation, simple et facile à utiliser:
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);
}
où expandableListView
est votre 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);
}
celui-ci a fonctionné pour moi
La fonction setIndicatorBounds(int left, int right)
est utilisée pour définir les limites de l'indicateur pour la vue de groupe d'un ExpandableListView
.
explvList.setIndicatorBounds(width-GetDipsFromPixel(35), width-GetDipsFromPixel(5));
Ici, largeur signifie largeur d'appareil.
Convertissez le pixel en 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);
}
Définissez d'abord Android: groupIndicator = "@ null" dans votre liste extensible comme ci-dessous:
puis dans votre disposition d'en-tête comme ci-dessous:
<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>
Enfin, ajoutez ceci dans votre adaptateur dans la méthode getGroupView, ajoutez ci-dessous:
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));
}
J'utilise le court morceau suivant inspiré par cet exemple qui nécessite deux drawables sur le dossier:
if (isExpanded) {
ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.up, 0);
} else {
ListHeader.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.down, 0);
}
Quoi qu'il en soit, j'ai dû adopter la solution de goodKode aussi "pour se débarrasser" des flèches par défaut.
Donc, je vous conseille de vous en tenir à la solution simple précédemment fournie car c'est l'approche la plus minimaliste et la plus précise.