Autore Topic: dimensionare a runtime lo spazio occupato da una expandable listview  (Letto 655 volte)

Offline gianpaolof

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: +4
    • Mostra profilo
ciao a tutti.
ho un problema con l'expandable list view e non so + che pesci prendere.

La expandable  list view ha 4 gruppi e devo fare in modo che soddisfi 2 requisiti:

1) ogni gruppo deve occupare 1/4 dell'altezza totale della lista

group A [1/4]
  child 1
  child 2
group B [1/4]
  child 1
group C [1/4]
  child 1
  child 2
  child 3
group D [1/4]
  child 1
  child 2


se chiudo uno (o più gruppi), i rimanenti si devono espandere in modo da dividersi lo spazio rimanente:
quindi se il gruppo A, una volta chiuso, ha un'altezza h, i 3 maledetti che rimangono avranno un'altezza
pari a (altezza_lista - h)/3

group A [h]
group B (altezza_lista - h)/3
child 1
group C (altezza_lista - h)/3
child 1
child 2
child 3
group D (altezza_lista - h)/3
child 1
child 2

Come diavolo si può fare una cosa del genere? Sto uscendo  pazzo. AIUTOOOO



Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:dimensionare a runtime lo spazio occupato da una expandable listview
« Risposta #1 il: 19 Marzo 2013, 03:51:08 CET »
0
Scusami ma queste specifiche chi te le ha date? Per scopo didattico all'Università?

Post unito: 19 Marzo 2013, 04:10:30 CET
Prima di calcolarti altezza e cose varie inizierei a vedere altre cose. Innanzitutto che tipi di children ha la tua expandableListView? Sono tutti uguali o diversi? Dovresti estendere la classe BaseExpandableListAdapter e fare l'override di alcuni metodi come getChildType, getGroupType etc...se hai fatto già qualcosa postalo altrimenti provo a copiarti l'esempio del mio progetto.

Post unito: 19 Marzo 2013, 04:30:01 CET
Dai uno sguardo anche qui http://developer.android.com/reference/android/widget/BaseExpandableListAdapter.html
« Ultima modifica: 19 Marzo 2013, 04:30:01 CET da elfo83, Reason: Merged DoublePost »

Offline gianpaolof

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: +4
    • Mostra profilo
Re:dimensionare a runtime lo spazio occupato da una expandable listview
« Risposta #2 il: 19 Marzo 2013, 11:03:06 CET »
0
ciao!
Grazie per la risposta. Dunque, l'app la stiamo sviluppando per un cliente, è lui che ci ha dato i requisiti.
Tra l'altro me ne sono fumato uno importantissimo: il nome dei gruppi deve rimanere fisso e solo i children devono scrollare. Ma questo
è impossibile da ottenere con la EspListView. Ho sc@zz@to di brutto, mi viene da piangere. :((((
Su stackoverflow ho trovato una traccia per impostare una pinned explistview, ma ormai non ho più tempo, perché ho una marea di cose da fare per questa app.

La cosa che mi viene in mente è:
-usare dei buttons come headers
-sotto i buttons inserire le listview
-quando voglio collassare una lista, la svuoto e chiamo la notifydatasetchanged()
-uso la setlayoutparams() per modificare l'altezza delle liste a run-time


Ecco l'adapter della explist che ho in questo momento:



public class CustomMapAdapter extends BaseExpandableListAdapter {


   public final static int PRJS_GROUP_POS = 0;
   public final static int RLINES_GROUP_POS= PRJS_GROUP_POS+1;
   public final static int ASSETS_GROUP_POS=RLINES_GROUP_POS+1;
   public final static int POSHIST_GROUP_POS=ASSETS_GROUP_POS+1;

   private Context mContext;
   private ArrayList<String> mGroups;
   private ArrayList<ArrayList<CustomMapPanelChild>> mChildren;
   private LayoutInflater mInflater;
   public  CustomMapAdapter(Context context, ArrayList<String> groups,
         ArrayList<ArrayList<CustomMapPanelChild>> children) {
      mContext = context;
      mGroups = groups;
      mChildren = children;
      mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   }


   public Object getChild(int groupPosition, int childPosition) {
      return mChildren.get(groupPosition).get(childPosition);
   }

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

   public View getChildView(int groupPosition, int childPosition, boolean isLastChild,View convertView, ViewGroup parent) {

      TextView textView;
      CustomMapPanelChild child = (CustomMapPanelChild) getChild(groupPosition, childPosition);
      switch (groupPosition){

      case PRJS_GROUP_POS:
         convertView = mInflater.inflate(R.layout.activity_custom_map_panel_child_prj, null);
         textView = (TextView) convertView.findViewById(R.id.title);
         textView.setText(child.getName());
         break;
      case RLINES_GROUP_POS:
         convertView = mInflater.inflate(R.layout.activity_custom_map_panel_child_redlines, null);
         textView = (TextView) convertView.findViewById(R.id.title);
         textView.setText(child.getName());
         ( ( ImageView )  convertView.findViewById( R.id.icon ) ).setVisibility(
               true == child.getSelectionStatus() ? View.VISIBLE : View.GONE );
         break;

      return convertView;
   }


   public int getChildrenCount(int groupPosition) {
      return mChildren.get(groupPosition).size();
   }

   public Object getGroup(int groupPosition) {
      return mGroups.get(groupPosition);
   }

   public int getGroupCount() {
      return mGroups.size();
   }

   public long getGroupId(int groupPosition) {
      return groupPosition;
   }


   public View getGroupView(int groupPosition, boolean isExpanded,
         View convertView, ViewGroup parent) {

      if(convertView==null){
         convertView=mInflater.inflate(R.layout.activity_map_panel_item, null);
      }
      TextView groupName = (TextView) convertView.findViewById(R.id.groupName);
      TextView groupDescr = (TextView) convertView.findViewById(R.id.groupDescr);
      TextView textView = (TextView) convertView.findViewById(R.id.list_item_text_view);
      textView.setText(getGroup(groupPosition).toString());
      return convertView;
   }


   @Override
   public boolean areAllItemsEnabled() {
      return super.areAllItemsEnabled();
   }

   public boolean hasStableIds() {
      return true;
   }

   public boolean isChildSelectable(int arg0, int arg1) {
      return true;
   }

}

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:dimensionare a runtime lo spazio occupato da una expandable listview
« Risposta #3 il: 19 Marzo 2013, 15:49:11 CET »
0
Allora, far scrollare solo i children all'interno dell'expandableListView non è possibile perché il gruppo scrolla con i children. Nel tuo caso, dato che hai solo 4 liste, puoi inserirne 4 a mano nel layout, ognuna sotto una TextView che fungerebbe da Header delle tue ListView. Per far scrollare i figli puoi settare le dimensioni del contenitore di ogni lista ad una dimensione fissa, in maniera tale che se l'altezza del numero di figli è > dell'altezza del contenitore, la lista scrolla. Per collassare una lista, credo che tu possa direttamente settargli il parametro invisibilità a gone, in modo tale che rimane solo la textview che funge da header. Si per settare la dimensione della lista, basta ridimensionare le dimensioni del contenitore che ospita la lista con getLayoutParams() e setLayoutParams. In questo modo la lista si adatterà al contenitore.

Offline gianpaolof

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: +4
    • Mostra profilo
Re:dimensionare a runtime lo spazio occupato da una expandable listview
« Risposta #4 il: 19 Marzo 2013, 15:58:35 CET »
0
ah, che scemo. la lista la collasso con la visibility, giusto.

grazie per l'aiuto, elfo :)

Offline elfo83

  • Utente normale
  • ***
  • Post: 283
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:dimensionare a runtime lo spazio occupato da una expandable listview
« Risposta #5 il: 19 Marzo 2013, 16:11:58 CET »
0
Di niente. Se hai problemi scrivi..

Offline gianpaolof

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: +4
    • Mostra profilo
Re:dimensionare a runtime lo spazio occupato da una expandable listview
« Risposta #6 il: 19 Marzo 2013, 16:13:42 CET »
0
certamente!
ciao!