Dans ExpandableListView
, existe-t-il un moyen de masquer l'indicateur de groupe pour les groupes sans enfants?
Essayez ceci >>>
pour tous les articles
getExpandableListView().setGroupIndicator(null);
En xml
Android:groupIndicator="@null"
La propriété Android:groupIndicator
prend un état pouvant être dessiné. En d'autres termes, vous pouvez définir une image différente pour différents états.
Lorsque le groupe n'a pas d'enfants, l'état correspondant est 'state_empty'
Voir ces liens de référence:
Pour state_empty
, vous pouvez définir une image différente qui ne soit pas source de confusion ou simplement utiliser une couleur transparente pour ne rien afficher ...
Ajouter cet article dans votre étatful drawable avec d'autres ....
<item Android:state_empty="true" Android:drawable="@Android:color/transparent"/>
Donc, votre statelist peut être comme ça:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_empty="true" Android:drawable="@Android:color/transparent"/>
<item Android:state_expanded="true" Android:drawable="@drawable/my_icon_max" />
<item Android:drawable="@drawable/my_icon_min" />
</selector>
Si vous utilisez un ExpandableListActivity, vous pouvez définir l'indicateur de groupe dans onCreate comme suit:
getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));
J'ai testé cela pour travailler.
En vous basant sur la réponse de StrayPointer et sur le code du blog, vous pouvez simplifier encore plus le code:
Dans votre XML, ajoutez ce qui suit à ExpandableListView:
Android:groupIndicator="@Android:color/transparent"
Ensuite, dans l'adaptateur, procédez comme suit:
@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean){
**...**
if ( getChildrenCount( groupPosition ) == 0 ) {
indicator.setVisibility( View.INVISIBLE );
} else {
indicator.setVisibility( View.VISIBLE );
indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed );
}
}
En utilisant la méthode setImageResource, vous obtenez tout cela avec un one-liner . Vous n'avez pas besoin des trois tableaux Integer de votre adaptateur. De plus, vous n'avez pas besoin d'un sélecteur XML pour les états développés et réduits. Tout se fait via Java.
De plus, cette approche affiche également le bon indicateur lorsqu'un groupe est développé par défaut, ce qui ne fonctionne pas avec le code du blog.
Comme indiqué dans une réponse différente, étant donné qu'Android considère un groupe de liste non développé comme vide, l'icône n'est pas dessinée, même si le groupe a des enfants.
Ce lien a résolu le problème pour moi: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html
Fondamentalement, vous devez définir le dessin par défaut comme transparent, déplacer le dessin dans votre vue de groupe en tant qu’image Image et basculer l’image dans votre adaptateur.
Dans votre code, utilisez simplement le code XML personnalisé pour la liste de groupes et insérez-y le ImageView pour GroupIndicator.
Et ajoutez les tableaux ci-dessous dans votre ExpandableListAdapter
private static final int[] EMPTY_STATE_SET = {};
private static final int[] GROUP_EXPANDED_STATE_SET = { Android.R.attr.state_expanded };
private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0
GROUP_EXPANDED_STATE_SET // 1
};
aussi dans la méthode de ExpandableListAdapter ajouter les mêmes choses que ci-dessous
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{
if (convertView == null)
{
LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.row_group_list, null);
}
//Image view which you put in row_group_list.xml
View ind = convertView.findViewById(R.id.iv_navigation);
if (ind != null)
{
ImageView indicator = (ImageView) ind;
if (getChildrenCount(groupPosition) == 0)
{
indicator.setVisibility(View.INVISIBLE);
}
else
{
indicator.setVisibility(View.VISIBLE);
int stateSetIndex = (isExpanded ? 1 : 0);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
}
return convertView;
}
Référence:http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html
cela pourrait être une autre façon de XML, définissez Android:groupIndicator="@null"
Lien de référence: https://stackoverflow.com/a/5853520/2624806
vous suggère ma solution:
1) Effacez groupIndicator par défaut:
<ExpandableListView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="wrap_content"
Android:layout_height="240dp"
Android:layout_gravity="start"
Android:background="#cccc"
Android:groupIndicator="@Android:color/transparent"
Android:choiceMode="singleChoice"
Android:divider="@Android:color/transparent"
Android:dividerHeight="0dp"
/>
2) dans ExpandableAdapter:
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(context);
}
((TextView) convertView).setText(groupItem.get(groupPosition));
((TextView) convertView).setHeight(groupHeight);
((TextView) convertView).setTextSize(groupTextSize);
//create groupIndicator using TextView drawable
if (getChildrenCount(groupPosition)>0) {
Drawable zzz ;
if (isExpanded) {
zzz = context.getResources().getDrawable(R.drawable.arrowup);
} else {
zzz = context.getResources().getDrawable(R.drawable.arrowdown);
}
zzz.setBounds(0, 0, groupHeight, groupHeight);
((TextView) convertView).setCompoundDrawables(null, null,zzz, null);
}
convertView.setTag(groupItem.get(groupPosition));
return convertView;
}
en XML
Android: groupIndicator = "@ null"
dans ExpandableListAdapter -> getGroupView copy code suivant
if (this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size() > 0){
if (isExpanded) {
arrowicon.setImageResource(R.drawable.group_up);
} else {
arrowicon.setImageResource(R.drawable.group_down);
}
}
Vous créez simplement une nouvelle présentation XML avec height = 0 pour l'en-tête de groupe masqué . Par exemple, il s'agit de 'group_list_item_empty.xml'.
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="0dp">
</RelativeLayout>
Ensuite, la disposition normale de votre en-tête de groupe est 'your_group_list_item_file.xml'
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="48dp"
Android:orientation="horizontal">
...your xml layout define...
</LinearLayout>
Enfin, vous venez de mettre à jour la méthode getGroupView dans votre classe Adapter:
public class MyExpandableListAdapter extends BaseExpandableListAdapter{
//Your code here ...
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
if (Your condition to hide the group header){
if (convertView == null || convertView instanceof LinearLayout) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.group_list_item_empty, null);
}
return convertView;
}else{
if (convertView == null || convertView instanceof RelativeLayout) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.your_group_list_item_file, null);
}
//Your code here ...
return convertView;
}
}
}
IMPORTANT: La balise racine des fichiers de présentation (caché et normal) doit être différente (comme dans l'exemple ci-dessus, LinearLayout et RelativeLayout)
Utilisez ceci, cela fonctionne parfaitement pour moi.
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/group_indicator_expanded" Android:state_empty="false" Android:state_expanded="true"/>
<item Android:drawable="@drawable/group_indicator" Android:state_empty="true"/>
<item Android:drawable="@drawable/group_indicator"/>
</selector>
Je voulais juste améliorer la réponse de Mihir Trivedi. Vous pouvez placer ceci dans getGroupView () qui se trouve dans la classe MyExpandableListAdapter
View ind = convertView.findViewById(R.id.group_indicator);
View ind2 = convertView.findViewById(R.id.group_indicator2);
if (ind != null)
{
ImageView indicator = (ImageView) ind;
if (getChildrenCount(groupPosition) == 0)
{
indicator.setVisibility(View.INVISIBLE);
}
else
{
indicator.setVisibility(View.VISIBLE);
int stateSetIndex = (isExpanded ? 1 : 0);
/*toggles down button to change upwards when list has expanded*/
if(stateSetIndex == 1){
ind.setVisibility(View.INVISIBLE);
ind2.setVisibility(View.VISIBLE);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
else if(stateSetIndex == 0){
ind.setVisibility(View.VISIBLE);
ind2.setVisibility(View.INVISIBLE);
Drawable drawable = indicator.getDrawable();
drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
}
}
}
... et en ce qui concerne la présentation, voici comment mon groupe_items.xml apparaît
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:id="@+id/group_heading"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingLeft="20dp"
Android:paddingTop="16dp"
Android:paddingBottom="16dp"
Android:textSize="15sp"
Android:textStyle="bold"/>
<ImageView
Android:id="@+id/group_indicator"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@Android:drawable/arrow_down_float"
Android:layout_alignParentRight="true"
Android:paddingRight="20dp"
Android:paddingTop="20dp"/>
<ImageView
Android:id="@+id/group_indicator2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@Android:drawable/arrow_up_float"
Android:layout_alignParentRight="true"
Android:visibility="gone"
Android:paddingRight="20dp"
Android:paddingTop="20dp"/>
Espérons que cela aide ... n'oubliez pas de laisser un vote positif
Avez-vous essayé de modifier l'attribut ExpandableListView
de Android:groupIndicator="@null"
?