2014-03-29 127 views
7

我有几个内容由Expandable listview.I无法滚动整个布局。 我一直在寻找适当的答案超过一个星期..推荐一些答案。scrollview内可扩展的列表视图

+0

的代码。 – Himani

+0

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

+0

我已经解决了同样的问题> https:/ /stackoverflow.com/questions/29943600/how-can-i-put-a-expandablelistview-into-a-scrollview-without-it-collapsing/46660821#46660821 –

回答

1

对于谁是寻找可扩展列表视图进入滚动型用户,使用视图,而不是扩展列表按照以下链接&代码 -

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> 

而且在Java类的一些事情像这个 -

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

这种方法只适用于你有100个项目,因为更多应用程序将冻结,直到所有项目的膨胀完成 –

6

你可以做到这一点很简单。将滚动视图的高度设置为wrap_content。将scroll view中根视图的高度设置为wrap_content(如线性布局),并将可展开列表视图设置为wrap_content。之后,设置OnGroupExpandListener和OnGroupCollapseListener为您的可展开列表视图并为其设置高度,只要可展开列表视图的子项。这样的代码: 布局:

<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> 

,这是您的片段:(或您的活动)

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

在计算onGroupExpand中的param.height时,我必须将1添加到子计数,以说明展开时,高度是标题加上子项的事实。 (这是假定页眉布局高度和子页眉高度相同的尺寸。) – k2col

+0

Works,但ExpandableListView为空... –

8

该解决方案为我工作,当我使用具有滚动导航视图中的自定义布局使用具有Expandable列表视图的LinearLayout进行查看。

<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> 

在你的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

为我工作。谢谢 –

+0

工作像一个魅力。非常感谢@amit –

+0

,但它只适用于当我点击可扩展列表视图的groupitem时。当我滚动视图时它不工作 –

2

我知道这个问题是很老,但可能这将是对别人有帮助的。基本上我的答案是Amit Tumkur和user2141833的答案的组合。大量的试验和错误后,下面的代码为我工作:

首先计算时,整个事情被折叠

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

然后扩展列表视图即初始高度单击组时设置可扩展列表视图的高度为Wrap内容

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是一个不同的方法:

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

然后在OnGroupExpandListener设定的可扩展列表视图的高度:

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

而且布置得ExpandableListView内的LinearLayout内滚动型。

希望这可以帮助别人。 :)

0

如果要滚动你的布局,那么你可以使用滚动条你布置在下方输入adapteSet

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