Réponses:
Essayez ceci >>>
pour tous les articles
getExpandableListView().setGroupIndicator(null);
En xml
android:groupIndicator="@null"
La android:groupIndicator
propriété prend un état activé drawable. Autrement dit, 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:
Car state_empty
, vous pouvez définir une image différente qui ne prête pas à confusion, ou simplement utiliser une couleur transparente pour ne rien afficher ...
Ajoutez cet élément dans votre dessin avec état avec d'autres ....
<item android:state_empty="true" android:drawable="@android:color/transparent"/>
Ainsi, votre liste de statistiques peut être comme ceci:
<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 une 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 fonctionner.
Sur la base de la réponse de StrayPointer et du code du blog, vous pouvez simplifier encore plus le code:
Dans votre xml, ajoutez les éléments suivants à ExpandableListView:
android:groupIndicator="@android:color/transparent"
Ensuite, dans l'adaptateur, vous 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 une seule ligne. Vous n'avez pas besoin des trois tableaux Integer de votre adaptateur. Vous n'avez pas non plus besoin d'un sélecteur XML pour l'état développé et réduit. Tout se fait via Java.
De plus, cette approche affiche également l'indicateur correct lorsqu'un groupe est développé par défaut ce qui ne fonctionne pas avec le code du blog.
getGroupView()
méthode de votre BaseExpandableListAdapter
implémentation. Jetez un œil à cet exemple d'implémentation .
ViewHolder
modèle. indicator
est le nom de variable du détenteur de la vue.
Comme mentionné dans une réponse différente, étant donné qu'Android traite un groupe de listes 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 dessinable dans votre vue de groupe en tant qu'ImageView et basculer l'image dans votre adaptateur.
Dans votre code il suffit d' utiliser le code XML personnalisé pour la liste des groupes et qui a mis le ImageView pour GroupIndicator .
Et ajoutez ci-dessous les tableaux 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
};
également dans la méthode de ExpandableListAdapter, ajoutez 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
En XML
android:groupIndicator="@null"
Dans ExpandableListAdapter
-> getGroupView
copier le 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);
}
}
cela pourrait être une autre façon de XML, définir android:groupIndicator="@null"
Lien de référence: https://stackoverflow.com/a/5853520/2624806
vous propose ma solution:
1) Effacer l'indicateur de groupe 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;
}
Je voulais juste améliorer la réponse de Mihir Trivedi. Vous pouvez le placer 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 comme pour la mise en page, voici comment mon group_items.xml semble être
<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"/>
J'espère que cela aide ... n'oubliez pas de laisser un vote favorable
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>
Avez-vous essayé de changer ExpandableListView
l'attribut de android:groupIndicator="@null"
?
Vous créez simplement une nouvelle mise en page XML avec hauteur = 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, votre disposition normale d'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 d'adaptateur:
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 mise en page (masqué et normal) doit être différente (comme dans l'exemple ci-dessus, LinearLayout et RelativeLayout)
convertView.setVisibility (View.GONE) devrait faire l'affaire.
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
DistanceHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false);
if (getChildrenCount(groupPosition)==0) {
convertView.setVisibility(View.GONE);
}