2016-05-04 11 views
0

Ich hatte ein Problem, das darauf zurückzuführen ist, dass Android bestimmte Probleme mit verschachtelten Bildlaufelementen hat.Berechnung der ExpandableListView-Höhe im anfänglichen Lebenszyklus

Ich habe eine ScrollView, die eine horizontale RecyclerView und eine ExpandableListView direkt darunter unterhält. Das Problem, auf das ich stieß, war, dass die ScrollView nicht scrollte.

Ich reparierte es durch: 1. feste Höhe zum RecyclerView einstellen. 2. Berechnen der ExpandableListView-Höhe mit jedem Gruppenelementklick. So:

expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 

      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
       setListViewHeight(parent, groupPosition); 
       return false; 
      } 
     }); 

private void setListViewHeight(ExpandableListView listView, int group) { 
     ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter(); 
     int totalHeight = 0; 
     int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(),View.MeasureSpec.EXACTLY); 
     for (int i = 0; i < listAdapter.getGroupCount(); i++) { 
      View groupItem = listAdapter.getGroupView(i, false, null, listView); 
      groupItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 

      totalHeight += groupItem.getMeasuredHeight(); 

      if (((listView.isGroupExpanded(i)) && (i != group)) || ((!listView.isGroupExpanded(i)) && (i == group))) 
      { 
       for (int j = 0; j < listAdapter.getChildrenCount(i); j++) 
       { 
        View listItem = listAdapter.getChildView(i, j, false, null,listView); 
        listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 
        totalHeight += listItem.getMeasuredHeight(); 
       } 
      } 
     } 

     ViewGroup.LayoutParams params = listView.getLayoutParams(); 
     int height = totalHeight + (listView.getDividerHeight() * (listAdapter.getGroupCount() - 1)); 
     if (height < 10) 
      height = 200; 
     params.height = height; 
     listView.setLayoutParams(params); 
     listView.requestLayout(); 
    } 

Problem: da ich die Listenansicht Höhe nur auf Gruppenelement Klick berechnen, wenn ich das Fragment nur öffnen und bis ich auf eine Gruppe Element klicken, wird der Scroll nicht. Ich habe herausgefunden, dass die Berechnung der Höhe des ExpandableListView Adapters in onCreateView problematisch ist, da es zu diesem Zeitpunkt noch leer ist.

Alle Ideen würden sehr geschätzt werden.

Antwort

1

Wenn Sie warten müssen, bis die Ansicht angelegt wurde, können Sie a ViewTreeObserver verwenden. Zum Beispiel:

protected void onCreate(Bundle savedInstanceState) { 

    ... 

    final View someView = findViewById(R.id.some_id); 
    someView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 

      // the values are now available 
      int mesuredHeight = someView.getMeasuredHeight(); 
      int height = someView.getHeight(); 

      // done, remove the observer 
      someView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
    }); 

    ... 
} 
+0

allerdings hat es die Leistung beeinträchtigt .. es scheint, dies jedes Mal, wenn ich den Bildschirm berühren aufgerufen wird .. und wenn ich hinzufügen, eine if-Anweisung, so dass es nur die Methode ruft das erste Mal, das Problem kehrt zurück. – BVtp

+0

tatsächlich wird der Listener in einer Endlosschleife aufgerufen. ohne zu berühren sogar – BVtp

+0

Es war diese Art von Problemen zu vermeiden, dass der Hörer entfernt wird. Hilft es, wenn Sie den Hörer ** entfernen, bevor Sie die Ansichten berühren? – bwt

Verwandte Themen