2014-03-29 15 views
7

Ich habe einige Inhalte gefolgt von Expandable listview.Ich kann nicht das gesamte Layout scrollen. Ich habe mehr als eine Woche nach der passenden Antwort gesucht. Versuchen Sie einige Antworten.Erweiterbare Listenansicht innerhalb von scrollview

+0

wenn Sie Ihr Layout blättern wollen, dann können Sie Bildlaufleiste in Sie Layout. – Himani

+0

https://stackoverflow.com/questions/29943600/how-can-i-put-a-expandablistlistview-into-a-scrollview-without-it-collapsing/46660821#46660821 –

+0

Ich habe das gleiche Problem zu lösen> https://stackoverflow.com/questions/29943600/how-can-i-put-a-expandablistlistview-into-a-scrollview-without-it-collapsing/46660821#46660821 –

Antwort

3

Erstens nehme ich an, dass Sie nicht mehr als ein Kindlayout in einer Bildlaufansicht verwenden, da eine Bildlaufansicht nur ein direktes Kind haben kann.

Zweitens sollten Sie keine Scroll-Komponente wie erweiterbare Liste verwenden, in einer Bildlaufansicht hier ist, warum ListView inside ScrollView is not scrolling on Android.

1

Für Anwender, die sich für expandierbares Listenansicht in Scrollview suchen, verwenden Ansichten statt erweiterbaren Liste folgen den unten stehenden Link & Code-

enter image description here

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:id="@+id/linear_listview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" /> 

</ScrollView> 

Und In Java Class soetwas wie this-

for (int i = 0; i < pProductArrayList.size(); i++) { 

      LayoutInflater inflater = null; 
      inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View mLinearView = inflater.inflate(R.layout.row_first, null); 

      final TextView mProductName = (TextView) mLinearView.findViewById(R.id.textViewName); 
      final RelativeLayout mLinearFirstArrow=(RelativeLayout)mLinearView.findViewById(R.id.linearFirst); 
      final ImageView mImageArrowFirst=(ImageView)mLinearView.findViewById(R.id.imageFirstArrow); 
      final LinearLayout mLinearScrollSecond=(LinearLayout)mLinearView.findViewById(R.id.linear_scroll); 

      if(isFirstViewClick==false){ 
      mLinearScrollSecond.setVisibility(View.GONE); 
      mImageArrowFirst.setBackgroundResource(R.drawable.arw_lt); 
      } 
      else{ 
       mLinearScrollSecond.setVisibility(View.VISIBLE); 
       mImageArrowFirst.setBackgroundResource(R.drawable.arw_down); 
      } 

      mLinearFirstArrow.setOnTouchListener(new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 

        if(isFirstViewClick==false){ 
         isFirstViewClick=true; 
         mImageArrowFirst.setBackgroundResource(R.drawable.arw_down); 
         mLinearScrollSecond.setVisibility(View.VISIBLE); 

        }else{ 
         isFirstViewClick=false; 
         mImageArrowFirst.setBackgroundResource(R.drawable.arw_lt); 
         mLinearScrollSecond.setVisibility(View.GONE); 
        } 
        return false; 
       } 
      }); 
+0

Diese Methode funktioniert nur, wenn Sie unter 100 Elemente haben, weil auf mehr wird die Anwendung freez bis das Aufblasen für alle Elemente erfolgt ist –

6

können Sie dies sehr einfach tun. Legen Sie die Höhe der Bildlaufansicht auf wrap_content fest. Legen Sie die Höhe der Stammansicht in der Bildlaufansicht als wrap_content fest (z. B. als lineares Layout), und legen Sie die erweiterbare Listenansicht auf wrap_content fest. Danach setzen Sie OnGroupExpandListener und OnGroupCollapseListener für Ihre erweiterbare Listenansicht und legen Sie die Höhe für diese fest, solange die untergeordnete Listenansicht angezeigt wird. wie dieser Code: Ihr Layout:

<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/scrollViewDrawer" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:fillViewport="true" 
> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="@color/mainGray" 
    > 
<ExpandableListView 
    android:id="@+id/expandableListCategory" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
       /> 
</LinearLayout> 
</ScrollView> 

und das ist Ihr Fragment: (oder in Ihrer Tätigkeit)

public class DrawerFragment extends Fragment implements, OnGroupExpandListener, OnGroupCollapseListener{ 
ScrollView scrollView; 
ExpandableListView expListView; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
view rootView = inflater.inflate(R.layout.fragment_layout, container, false); 
scrollView = (ScrollView) rootView.findViewById(R.id.scrollViewDrawer); 
expListView = (ExpandableListView) rootView.findViewById(R.id.expandableListCategory); 
.... 
} 
@Override 
public void onGroupExpand(int groupPosition) { 
    LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) expListView.getLayoutParams(); 
    param.height = (childCount * expListView.getHeight()); 
    expListView.setLayoutParams(param); 
    expListView.refreshDrawableState(); 
    scrollView.refreshDrawableState(); 
} 

@Override 
public void onGroupCollapse(int groupPosition) { 
    LinearLayout.LayoutParams param = (LinearLayout.LayoutParams) expListView.getLayoutParams(); 
    param.height = LinearLayout.LayoutParams.WRAP_CONTENT; 
    expListView.setLayoutParams(param); 
    expListView.refreshDrawableState(); 
    scrollView.refreshDrawableState(); 
} 
+1

Bei der Berechnung von param.height in onGroupExpand, musste ich 1 zur Anzahl der Kinder hinzufügen, um die Tatsache zu berücksichtigen, dass, wenn erweitert, die Höhe ist die Kopfzeile plus die Kinder. (Dies setzt voraus, dass die Kopfzeilenlayouthöhe und die Höhe der untergeordneten Kopfzeile dieselbe Größe haben.) – k2col

+0

Funktioniert, aber ExpandableListView ist leer ... –

8

Diese Lösung funktionierte für mich, wenn ich benutzerdefiniertes Layout innerhalb Navigationsansicht mit Scroll verwendet Ansicht mit LinearLayout, die eine erweiterbare Listenansicht hat.

<android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:headerLayout="@layout/nav_header"> 
    <ScrollView 
      android:fillViewport="true" 
      android:layout_marginTop="130dp" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical"> 

       <LinearLayout 
        android:id="@+id/homeLayout" 
        android:clickable="true" 
        android:gravity="center_vertical" 
        android:background="@drawable/layout_click_effect" 
        android:layout_width="match_parent" 
        android:layout_height="45dp"> 

        <ImageView 
         android:id="@+id/homeIv" 
         android:layout_width="45dp" 
         android:layout_height="wrap_content" 
         android:src="@mipmap/ic_home_black_24dp" /> 

        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="Home" /> 
       </LinearLayout> 
       <View 
        android:background="@android:color/darker_gray" 
        android:layout_width="match_parent" 
        android:layout_height="1dp"/> 

       <ExpandableListView 
        android:id="@+id/topCatgExpLv" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="start" 
        android:groupIndicator="@null" 
        android:dividerHeight="1dp" /> 
     </ScrollView> 


    </android.support.design.widget.NavigationView> 

In Ihrem onCreate

mListView = (ExpandableListView) findViewById(R.id.activity_expandable_list_view); 
    MyExpandableListAdapter adapter = new MyExpandableListAdapter(this, 
      mGroups); 
    mListView.setAdapter(adapter); 
    mListView.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(); 

} 
+0

Arbeitete für mich. Danke –

+0

arbeitete wie ein Charme. Danke viel @amit –

+0

aber es funktioniert nur, wenn ich den groupitem der ausdehnbaren listview.when ich scrolle die Ansicht sein, die nicht funktioniert –

2

Ich weiß, die Frage ist ziemlich alt, aber sein kann es für jemanden nützlich sein wird. Grundsätzlich ist meine Antwort eine Kombination aus den Antworten von Amit Tumkur und user2141833. Nach einer Menge von Versuch und Irrtum, wird der folgende Code für mich arbeiten:

zuerst die Anfangshöhe der erweiterbaren Listenansicht dh die Berechnung, wenn die ganze Sache

for (Integer i = 0; i < mAdapter.getGroupCount(); i++) { 
     View groupItem = mAdapter.getGroupView(i, false, null, mExpandableListView); 
     groupItem.measure(mExpandableListView.getWidth(), View.MeasureSpec.UNSPECIFIED); 
     mInitialHeight += groupItem.getMeasuredHeight(); 
    } 

Dann kollabiert ist, wenn die Gruppe angeklickt wird Inhalt

mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
     @Override 
     public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
      //Other Expansion/Collapsing Logic 
      setListHeightToWrap(); 
      return true; 
     } 
    }); 

setListHeightToWrap Wickeln Sie die Höhe der erweiterbaren Liste gesetzt, ist eine andere Methode:

private void setListHeightToWrap() { 
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mExpandableListView.getLayoutParams(); 
    params.height = ViewGroup.LayoutParams.WRAP_CONTENT; 
    mExpandableListView.setLayoutParams(params); 
    mExpandableListView.refreshDrawableState(); 
    mScrollView.refreshDrawableState(); 
} 

Dann in OnGroupExpandListener stellen Sie die Höhe der erweiterbare Liste Darstellung als:

mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 
     @Override 
     public void onGroupExpand(int groupPosition) { 
      LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mStitchingWorksListView.getLayoutParams(); 
      //The Logic here will change as per your requirements and the height of each of the children in the group 
      if (mAdapter.getRealChildrenCount(groupPosition) > 6) { 
       params.height = 9 * mInitialHeight; 
      } else { 
       params.height = 6 * mInitialHeight; 
      } 
      //For Last Group in the list and the number of children were less as compared to other groups 
      if (groupPosition == mAdapter.getGroupCount() - 1) { 
       params.height = 3 * mInitialHeight; 
      } 
      mExpandableListView.setLayoutParams(params); 
      mExpandableListView.refreshDrawableState(); 
      mExpandableListView.refreshDrawableState(); 
     } 
    }); 

Auch das Layout ExpandableListView innen Linearlayout innerhalb Scroll war.

Ich hoffe, das hilft jemandem. :)

0

den Code unten adapteSet Geben Sie

enter code hereListAdapter listAdapter = listView.getAdapter(); 
int totalHeight = 0; 
for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
} 

ViewGroup.LayoutParams params = listView.getLayoutParams(); 
params.height = totalHeight 
     + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
listView.setLayoutParams(params); 
listView.requestLayout(); 
Verwandte Themen