0

J'ai rencontré quelques questions sur SO concernant la même chose et les ai essayé.3 niveau ExpandableListView Android

Je peux montrer jusqu'à 2 niveaux dans la liste extensible, mais je ne peux pas montrer le troisième niveau quand je clique sur le deuxième niveau.

J'ai essayé quelque chose comme ceci: -

ParentView (premier niveau)

public class ParentView : BaseExpandableListAdapter 
    { 
     public static int FIRST_LEVEL_COUNT = 6; 
     public static int SECOND_LEVEL_COUNT = 4; 
     public static int THIRD_LEVEL_COUNT = 10; 
     private Context context; 



     public ParentView(Context context) 
     { 
      this.context = context; 
     } 

     public ParentView() 
     { 
     } 

     public override Java.Lang.Object GetChild(int groupPosition, int childPosition) 
     { 
      return childPosition; 
     } 


     public override long GetChildId(int groupPosition, int childPosition) 
     { 
      return childPosition; 
     } 



     public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) 
     { 
      var SecondLevelexplv = new CustExpListview(Application.Context); 
      SecondLevelexplv.SetAdapter(new SecondLevelAdapter(context)); 
      SecondLevelexplv.SetGroupIndicator(null); 
      return SecondLevelexplv; 
     } 

     public override int GetChildrenCount(int groupPosition) 
     { 
      return 3; 
     } 

     public override Java.Lang.Object GetGroup(int groupPosition) 
     { 
      return groupPosition; 
     } 
     public override int GroupCount 
     { 
      get 
      { 
       return 5; 
      } 
     } 

     public override long GetGroupId(int groupPosition) 
     { 
      return groupPosition; 
     } 

     public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent) 
     { 
      var tv = new TextView(Application.Context) 
      { 
       Text = "->FirstLevel", 
      }; 
      tv.SetBackgroundColor(Color.Blue); 
      tv.SetPadding(10, 7, 7, 7); 

      return tv; 
     } 

     public override bool IsChildSelectable(int groupPosition, int childPosition) 
     { 
      return true; 
     } 

     public override bool HasStableIds 
     { 
      get 
      { 
       return true; 
      } 
     } 

    } 

CustExpListView

public class CustExpListview : ExpandableListView 
{ 

public CustExpListview(Context context) : base(context) 
{ 
} 

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    widthMeasureSpec = MeasureSpec.MakeMeasureSpec(999999, MeasureSpecMode.AtMost); 
    heightMeasureSpec = MeasureSpec.MakeMeasureSpec(999999, MeasureSpecMode.AtMost); 
    OnMeasure(widthMeasureSpec, heightMeasureSpec); 
} 
} 

SecondLevelAdapter

public class SecondLevelAdapter : BaseExpandableListAdapter 
{ 
public static int THIRD_LEVEL_COUNT = 10; 
private Context context; 
private readonly ParentView parentView; 

public SecondLevelAdapter(Context context) 
{ 
    this.context = context; 
} 

public SecondLevelAdapter(ParentView parentView) 
{ 
this.parentView = parentView; 
} 

public override Java.Lang.Object GetGroup(int groupPosition) 
{ 
    return groupPosition; 
} 

public override int GroupCount 
{ 
    get 
    { 
     return 5; 
    } 
} 



public override long GetGroupId(int groupPosition) 
{ 
    return groupPosition; 
} 


public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent) 
{ 
    var tv = new TextView(Application.Context) 
    { 
     Text = "-->Second" 
    }; 
    tv.SetPadding(12, 7, 7, 7); 
    tv.SetBackgroundColor(Color.GreenYellow); 

    return tv; 
} 



public override Java.Lang.Object GetChild(int groupPosition, int childPosition) 
{ 
    return childPosition; 
} 

public override long GetChildId(int groupPosition, int childPosition) 
{ 
    return childPosition; 
} 



public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) 
{ 
    var tv = new TextView(Application.Context) 
    { 
     Text = "third" 
    }; 
    tv.SetPadding(18, 5, 5, 5); 
    tv.SetBackgroundColor(Color.Green); 

    return tv; 
} 


public override int GetChildrenCount(int ChildPosition) 
{ 
    return 4; 
} 


public override bool IsChildSelectable(int groupPosition, int childPosition) 
{ 
    return true; 
} 

public override bool HasStableIds 
{ 
    get 
    { 
     return true; 
    } 
} 

}

Ce que j'ai remarqué est que le GetChildView() dans le SecondLevelAdapter n'est jamais appelé bien que le GetGroup() soit appelé. Je veux vraiment étendre la liste jusqu'à 4 niveaux, mais je suis coincé au 3ème niveau lui-même.

Toute aide est appréciée.

+2

liste extensible à 4 niveaux sur mobile? Je pense que vous pourriez repenser votre design pour avoir l'air plus mobile comme [ceci] (https://docs.microsoft.com/fr-fr/windows/uwp/controls-and-patterns/images/patterns-md-stacked.png). –

+0

@ R.Zagórski bien le client a ce genre d'exigence qui ne peut être compromise sur :) – user3034944

Répondre

0

Le problème est pour chaque ligne de -->Second c'est un ensemble ExpandableListView, qui contient 5 groupes. Et comme la hauteur du groupe parent actuel ne se développera pas automatiquement pour l'enfant ExpandableListView. Vous ne pouvez pas voir la liste des enfants ouverts: third.

Pour résoudre le problème, il y a quelques changements à apporter:

  1. Modifier la GroupCount de SecondLevelAdapter de 5 à 1:

    public override int GroupCount 
    { 
        get 
        { 
         //return 5; 
         return 1;//Change GroupCount to 1 
        } 
    } 
    
  2. Vous devez changer la hauteur chaque deuxième niveau ExpandableListView manuellement. Cela peut se faire par la mise en œuvre GroupExpand et GroupCollapse événements:

    ParentView.cs:

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) 
    { 
        var SecondLevelexplv = new CustExpListview(Application.Context); 
        SecondLevelexplv.SetAdapter(new SecondLevelAdapter(context)); 
        SecondLevelexplv.SetGroupIndicator(null); 
        SecondLevelexplv.GroupExpand += SecondLevelexplv_GroupExpand; 
        SecondLevelexplv.GroupCollapse += SecondLevelexplv_GroupCollapse; 
        return SecondLevelexplv; 
    } 
    
    private void SecondLevelexplv_GroupCollapse(object sender, ExpandableListView.GroupCollapseEventArgs e) 
    { 
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MatchParent, 70); 
        (sender as CustExpListview).LayoutParameters = lp; 
    } 
    
    private void SecondLevelexplv_GroupExpand(object sender, ExpandableListView.GroupExpandEventArgs e) 
    { 
        //expand the group and the height is the `children count` * `unit height` 
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MatchParent, 70 * 5); 
        (sender as CustExpListview).LayoutParameters = lp; 
    } 
    

Ainsi, il fonctionne correctement:

enter image description here

+0

Merci cela a bien fonctionné. – user3034944