2016-06-03 25 views
7

Ich habe eine ExpandableListView innerhalb einer NestedScrollView (ja ich weiß, es ist nicht gut, eine Scrollansicht in einer anderen Scrollansicht zu haben, aber ich weiß nicht, was ich sonst tun soll Bitte sag mir, ob jemand einen besseren Ansatz kennt.Android - NestedScrollView, die ExpandableListView enthält, blättert nicht, wenn erweitert

Die Größe des Inhalts in NestedScrollView ist nach wie vor innerhalb des Bildschirms, so dass es nicht bewegen, aber wenn ExpandableListView erweitert wird, wird der Inhalt außerhalb des Bildschirms auslaufen, aber die NestedScrollView blättert noch nicht .. Warum ist das so ?

Hier ist mein NestedScrollView Layout:

<NestedScrollView> 
    <LinearLayout> 
     <LinearLayout></LinearLayout> 
     ... // About 3 of the LinearLayouts 
     <ExpandableListView/> 
    </LinearLayout> 
</NestedScrollView> 
+0

diesen Link verweisen http://thedeveloperworldisyours.com/android/expandable-listview-inside-scrollview/#sthash.6gtbdQ0F.dpbs – anonymous

Antwort

30

Sie können NonScrollExpandableListView verwenden, um die Nicht-Scroll-Eigenschaft eines beliebigen Lisview oder GridView oder ExpandableListView durch Überschreiben der folgenden Methode zu erreichen.

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
      Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); 
    ViewGroup.LayoutParams params = getLayoutParams(); 
    params.height = getMeasuredHeight(); 
} 

So NonScrollExpandableListView für die Nutzung benötigen Sie eine benutzerdefinierte Klasse zu machen.

public class NonScrollExpandableListView extends ExpandableListView { 

    public NonScrollExpandableListView(Context context) { 
     super(context); 
    } 

    public NonScrollExpandableListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public NonScrollExpandableListView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
       Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); 
     ViewGroup.LayoutParams params = getLayoutParams(); 
     params.height = getMeasuredHeight(); 
    } 
} 

Und verwenden Sie es gerne.

<com.example.extraclasses.NonScrollExpandableListView 

    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

Glückliche Kodierung.

+0

Wird dies Leistungsproblem verursachen? Es funktionierte zwar, aber ich bin besorgt über das Leistungsproblem (hatte NestedScrollview Eltern RecyclerView und oh verdammt, die Speicherauslastung ...) –

+0

Überhaupt nicht. infizieren es wird empfohlen, dies in Fällen wie deins zu verwenden. –

+0

Es hat gut funktioniert, aber kann ich einfach expandableListView.onMeasure() verwenden und keine neue Klasse erstellen? Ich bin immer noch neu in der Herstellung dieser Art von benutzerdefinierten Klassen .. Oh und übrigens ist es "in der Tat" nicht "anstecken" lol –

1

Wir nicht Listview, Gridview oder erweiterbar Listview innerhalb Scrollview verwenden können. Wenn Sie erweiterbare ListView in scrollview verwenden möchten, müssen Sie Ihrer erweiterbaren Listview eine feste Höhe zuweisen.

+0

Oh ich sehe, also muss es eine feste Höhe sein .. Wenn ich eine feste Höhe geben würde, zum Beispiel 40 dp, würde es so viel Platz brauchen, selbst wenn es erweitert wird? Und wie machen Leute 'ExpandableListView' in einer anderen Scroll-Ansicht? Ich habe mehrere Apps wie diese gesehen .. –

+0

@KevinMurvie Standardmäßig Android wird nicht vollständig unterstützt eine scrollbare Ansicht in einer anderen scrollbaren Ansicht. Aber wir können etwas tun und es kann getan werden. Aber es wird nicht perfekt sein. [Für Ihre Referenz] (http://stackoverflow.com/questions/6210895/listview-inside-scrollview-is-not-scrolling-on-android/11554684#11554684) –

+0

Eigentlich habe ich das gesehen und ich habe mich beworben das (RecyclerView in NestedScrollView) .. Aber schade, es hat Performance-Probleme und ich mache es mit Recyclerview .. Also spielen diese Apps tatsächlich nicht nach den Regeln? –

-2

Fügen Sie Ihrem ExpandalbleListView-Layout android:nestedScrollingEnabled="true" hinzu.

1

Verwenden Sie diese Methode, um die ExpendableListSize zur Laufzeit zu berechnen.

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(); 

} 

Ein Aufruf dieser Methode in der setOnGroupClickListener.like unter

mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
     @Override 
     public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 

      setListViewHeight(parent, groupPosition); 
      return false; 
     } 
    });