web-dev-qa-db-fra.com

Affichage de liste extensible Indicateur d'icône de groupe de déplacement à droite

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); 
62
exception01

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.

20
Michael

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);
    }
}
71
luben

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());
        }
    });
39
varun bhardwaj

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!

39
goodKode

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.

11

Affichage de liste extensible Indicateur d'icône de groupe de déplacement à droite

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:

5
IntelliJ Amiya

É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;
}
  • Élément de liste
3
Sahil Choudhary
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));

}
2
Yogesh C

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é!

1
Gopi cg

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);
        }

expandableListView est votre ExpandableListview

0
Badr At
     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

0
Liya

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);
} 
0
Akshay Chopde

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));
}
0
ANAL SHAH

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.

0
JorgeAmVF