ScrollView里面的ListView不在Android上滚动

我在ScrollView里滚动ListView时遇到了麻烦。 我有一个活动,其中有一些EditTexts在顶部,然后一个标签主机与两个选项卡有一个ListView每个。 当EditText视图集中时,软键盘出现,因为我有一个滚动视图,内容是可滚动的。 但是,当ListView中有更多的项目(标签中的项目)时,问题就来了,即使有更多的项目,我也无法滚动ListView。

以下是XML的布局:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="?backgroundImage" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="50dip" android:layout_alignParentBottom="true" android:layout_margin="10dip" android:id="@+id/buttons"> <Button android:text="Save" android:layout_margin="2dip" android:textSize="20dip" android:id="@+id/btnSaveorUpdate" android:layout_height="wrap_content" android:layout_width="145dip"></Button> <Button android:text="Cancel" android:layout_margin="2dip" android:textSize="20dip" android:id="@+id/btnCancelorDelete" android:layout_height="wrap_content" android:layout_width="145dip"></Button> </LinearLayout> <ScrollView android:layout_above="@id/buttons" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:layout_margin="10dip"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="10dip"> <TextView android:text="Bill details" android:textColor="?textColorDark" android:layout_alignParentTop="true" android:id="@+id/txtEnterDetails" android:textSize="25dip" android:textStyle="bold" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_marginBottom="2dip"></TextView> <LinearLayout android:focusable="true" android:focusableInTouchMode="true" android:layout_width="0dip" android:layout_height="0dip" /> <EditText android:layout_width="fill_parent" android:hint="Enter data" android:inputType="numberDecimal" android:id="@+id/txtSample" android:textSize="@dimen/editText" android:layout_height="@dimen/editTextHeight" android:text=""></EditText> <EditText android:layout_width="fill_parent" android:id="@+id/txtDescription" android:hint="Enter description" android:textSize="@dimen/editText" android:layout_height="@dimen/editTextHeight" android:inputType="text" android:text=""></EditText> <EditText android:layout_width="fill_parent" android:id="@+id/txtComment" android:hint="Enter comment (if any)" android:textSize="@dimen/editText" android:layout_height="@dimen/editTextHeight" android:inputType="text" android:text=""></EditText> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/txtDate" android:layout_width="wrap_content" android:text="" android:textSize="20dip" android:textColor="?textColorDark" android:layout_marginLeft="10dip" android:layout_height="@dimen/editTextHeight" android:layout_gravity="center_vertical" /> <Button android:id="@+id/btnPickDate" android:layout_width="wrap_content" android:layout_height="@dimen/editTextHeight" android:text="Select date" android:layout_margin="2dip" android:textSize="15dip" android:layout_gravity="center_vertical" /> </LinearLayout> <TabHost android:id="@+id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TabWidget android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@android:id/tabs"></TabWidget> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@android:id/tabcontent"> <ScrollView android:layout_above="@id/buttons" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:id="@+id/tab1"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent"> <TableRow android:id="@+id/tableRow1" android:layout_marginLeft="2dip" android:layout_marginRight="5dip" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:src="@drawable/ic_menu_invite" android:layout_width="40dip" android:layout_height="40dip" android:layout_gravity="center_vertical"></ImageView> <TextView android:text="Add friend" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_centerVertical="true" android:textColor="?textColorDark" android:textSize="@dimen/editText" android:layout_gravity="center_vertical" /> </LinearLayout> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:layout_marginRight="5dip"> <TextView android:id="@+id/txtData1" android:layout_width="170dip" android:layout_height="wrap_content" android:text="Data" android:textSize="14dip" android:textStyle="bold" android:textColor="#000000"> </TextView> <TextView android:id="@+id/txtData2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sample" android:textSize="13dip" android:textColor="#000000"></TextView> </TableRow> </TableLayout> <ListView android:cacheColorHint="#00000000" android:id="@+id/ListView01" android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout> </ScrollView> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:id="@+id/tab2" android:orientation="vertical"> <TableLayout android:layout_height="wrap_content" android:layout_width="fill_parent"> <TableRow android:id="@+id/tableRow2" android:layout_marginLeft="2dip" android:layout_marginRight="5dip" android:layout_width="fill_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:src="@drawable/ic_menu_invite" android:layout_width="40dip" android:layout_height="40dip" android:layout_gravity="center_vertical"></ImageView> <TextView android:text="Sample" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_centerVertical="true" android:textColor="?textColorDark" android:textSize="@dimen/editText" android:layout_gravity="center_vertical" /> </LinearLayout> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:layout_marginRight="5dip"> <TextView android:id="@+id/txtUser1" android:layout_width="170dip" android:layout_height="wrap_content" android:text="User" android:textSize="14dip" android:textStyle="bold" android:textColor="#000000"> </TextView> <TextView android:id="@+id/txtUserData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="UserData" android:textSize="13dip" android:textColor="#000000"></TextView> </TableRow> </TableLayout> <ListView android:cacheColorHint="#00000000" android:id="@+id/ListView02" android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout> </ScrollView> </RelativeLayout> 

请谁能告诉我这是什么问题? 我在ScrollView问题里面有ListView的另一个post,但是在我的情况下他们没用。

22 Solutions collect form web for “ScrollView里面的ListView不在Android上滚动”

你不应该把一个ListView放在一个ScrollView里面,因为ListView类实现了自己的滚动function,它只是不接收手势,因为它们都是由父ScrollView处理的。 我强烈build议你以某种方式简化你的布局。 例如,您可以将要滚动的视图添加到ListView作为页眉或页脚。

更新

从Android Level 21(Lollipop)嵌套滚动容器开始,Android SDK正式支持。 ViewViewGroup类中有很多方法提供这个function。 要在棒棒糖上进行嵌套滚动工作,必须通过在其XML声明中添加android:nestedScrollingEnabled="true"或通过显式调用setNestedScrollingEnabled(true)来为子滚动视图启用它。

如果您想要在棒棒糖设备上进行嵌套滚动,您可能需要使用支持库中相应的实用程序类。 首先你必须用NestedScrollViewreplace你的ScrollView 。 后者实现了NestedScrollingParent和NestedScrollingChild,因此可以用作父级或子级滚动容器。

ListView不支持嵌套滚动,因此您需要NestedScrollingChild它并实现NestedScrollingChild 。 幸运的是,支持库提供了NestedScrollingChildHelper类,所以你只需要创build这个类的一个实例,并从视图类的相应方法中调用它的方法。

我发现了一个出色的解决scheme,并且可以毫无问题地滚动ListView

 ListView lv = (ListView)findViewById(R.id.myListView); // your listview inside scrollview lv.setOnTouchListener(new ListView.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(false); break; } // Handle ListView touch events. v.onTouchEvent(event); return true; } }); 

这样做是禁用ScrollView上的TouchEvent ,并使ListView拦截它们。 这是简单的,一直工作。

我也有一个解决scheme。 我总是使用这种方法。 尝试这个

 <ScrollView android:id="@+id/createdrill_scrollView" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="15dp" > <net.thepaksoft.fdtrainer.NestedListView android:id="@+id/crewList" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:layout_weight="1" android:background="@drawable/round_shape" android:cacheColorHint="#00000000" > </net.thepaksoft.fdtrainer.NestedListView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="15dp" > <net.thepaksoft.fdtrainer.NestedListView android:id="@+id/benchmarksList" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:layout_weight="1" android:background="@drawable/round_shape" android:cacheColorHint="#00000000" > </net.thepaksoft.fdtrainer.NestedListView> </LinearLayout> </ScrollView> 

NestedListView.java类:

 public class NestedListView extends ListView implements OnTouchListener, OnScrollListener { private int listViewTouchAction; private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 99; public NestedListView(Context context, AttributeSet attrs) { super(context, attrs); listViewTouchAction = -1; setOnScrollListener(this); setOnTouchListener(this); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { scrollBy(0, -1); } } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int newHeight = 0; final int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { ListAdapter listAdapter = getAdapter(); if (listAdapter != null && !listAdapter.isEmpty()) { int listPosition = 0; for (listPosition = 0; listPosition < listAdapter.getCount() && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++) { View listItem = listAdapter.getView(listPosition, null, this); //now it will not throw a NPE if listItem is a ViewGroup instance if (listItem instanceof ViewGroup) { listItem.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); } listItem.measure(widthMeasureSpec, heightMeasureSpec); newHeight += listItem.getMeasuredHeight(); } newHeight += getDividerHeight() * listPosition; } if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize)) { if (newHeight > heightSize) { newHeight = heightSize; } } } else { newHeight = getMeasuredHeight(); } setMeasuredDimension(getMeasuredWidth(), newHeight); } @Override public boolean onTouch(View v, MotionEvent event) { if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { scrollBy(0, 1); } } return false; } } 

您必须使用此Custom ScrollView <com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >replace<ScrollView ></ScrollView> ,例如<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >

 package com.tmd.utils; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.widget.ScrollView; public class VerticalScrollview extends ScrollView{ public VerticalScrollview(Context context) { super(context); } public VerticalScrollview(Context context, AttributeSet attrs) { super(context, attrs); } public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false" ); super.onTouchEvent(ev); break; case MotionEvent.ACTION_MOVE: return false; // redirect MotionEvents to ourself case MotionEvent.ACTION_CANCEL: Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false" ); super.onTouchEvent(ev); break; case MotionEvent.ACTION_UP: Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false" ); return false; default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action ); break; } return false; } @Override public boolean onTouchEvent(MotionEvent ev) { super.onTouchEvent(ev); Log.i("VerticalScrollview", "onTouchEvent. action: " + ev.getAction() ); return true; } } 

我有一个同样的问题,而谷歌search,我发现你的问题。 是标记的答案也为我工作,但也有一些问题。
反正我find了另一个解决scheme 。 没有任何杂耍,完美的作品。

 list.setOnTouchListener(new OnTouchListener() { // Setting on Touch Listener for handling the touch inside ScrollView @Override public boolean onTouch(View v, MotionEvent event) { // Disallow the touch request for parent scroll on touch of child view v.getParent().requestDisallowInterceptTouchEvent(true); return false; } }); 

这是在滚动视图中使用Listview的确切方法。 我们必须处理触摸事件。

  lstvNextTracks.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.e("Lisview *************", "focused"); SCView.requestDisallowInterceptTouchEvent(true); return false; } }); SCView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int arr[] = new int[] { 1, 2 }; lstvNextTracks.getLocationOnScreen(arr); /* Get bounds of child Listview*/ int lstvTop = arr[0]; int lstvBottom = arr[1] + lstvNextTracks.getHeight(); int lstvLeft = arr[1]; int lstvRight = arr[0] + lstvNextTracks.getWidth(); float x = event.getRawX(); float y = event.getRawY(); if (event.getAction() == MotionEvent.ACTION_DOWN) { /*check if child ListView bounds are touched*/ if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight) { SCView.clearFocus(); /*This statement tells the ScrollView to do not handle this touch event, so the child Listview will handle this touch event and will scroll */ SCView.requestDisallowInterceptTouchEvent(true); /*The child Listview isFocusable attribute must be set to true otherwise it will not work*/ lstvNextTracks.requestFocus(); return true; } else return false; } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (x > lstvTop && x < lstvBottom && y > lstvLeft && y < lstvRight) { SCView.clearFocus(); SCView.requestDisallowInterceptTouchEvent(true); lstvNextTracks.requestFocus(); return true; } else return false; } else if (event.getAction() == MotionEvent.ACTION_UP) { SCView.clearFocus(); SCView.requestDisallowInterceptTouchEvent(true); lstvNextTracks.requestFocus(); return false; } else { return false; } } }); 

使用下面的方法,享受!

 private void setListViewScrollable(final ListView list) { list.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { listViewTouchAction = event.getAction(); if (listViewTouchAction == MotionEvent.ACTION_MOVE) { list.scrollBy(0, 1); } return false; } }); list.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (listViewTouchAction == MotionEvent.ACTION_MOVE) { list.scrollBy(0, -1); } } }); } 

listViewTouchAction是一个全局整数值。 如果你可以更换线路

 list.scrollBy(0, 1); 

与别的东西,请与我们分享。

请享用!

有两个不同的滚动视图在一起是一个不好的做法。 ListView本身有自己的滚动function,根据行项目的适配器设置自动调整高度(记住Keelping,我们没有在我们的Layout xml中为ListView设置特定的高度)。 然而在你的情况下,你可以用一个类replaceListView,这将调整你的ListView的高度,记住你的ListView是在ScrollView中。

这将帮助您:

 public class ExpandableHeightListview extends ListView { boolean expanded = false; public ExpandableHeightListview(Context context) { super(context); } public ExpandableHeightListview(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandableHeightListview(Context context, AttributeSet attrs,int defStyle) { super(context, attrs, defStyle); } public boolean isExpanded() { return expanded; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // HACK! TAKE THAT ANDROID! if (isExpanded()) { // Calculate entire height by providing a very large height hint. // But do not use the highest 2 bits of this integer; those are // reserved for the MeasureSpec mode. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } public void setExpanded(boolean expanded) { this.expanded = expanded; } } 

现在用这个类扩展你的ListView,只需要将你的ListView标记从你的资源xml改成这样,

 <yourpackagename.ExpandableHeightListview android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/White" android:scrollbars="none" android:orientation="vertical" android:fadingEdge="none"> </cyourpackagename.ExpandableHeightListview> 

这将解决您的滚动ListView的问题,因为现在父滚动是由ScrollView而不是ListViewpipe理的。

最好的解决scheme是将NestedScrollVew与RecyclerView一起使用,或者如果您想要使用Listview,那么您可以向此添加页眉和页脚视图。 例如:

 View footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.outofoffice_footer_view, null, false); infoListView.addFooterView(footerView); 

我已经尝试和testing了上面提到的几乎所有的方法,相信我,在完全从RecyclerView离开后,我用RecyclerView取代了我的ListView,并且完美地工作。 没有任何第三方库的ExtendedHeightListView和所有,只是普通和简单的RecyclerView。

所以inheritance人我的布局文件之前recyclerView:

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:elevation="5dp"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/relativeLayoutre" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" tools:context="com.example.android.udamovappv3.activities.DetailedActivity"> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar_detail" android:layout_width="match_parent" android:layout_height="56dp" android:layout_gravity="top" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <TextView android:id="@+id/title_name" android:layout_width="fill_parent" android:layout_height="128dp" android:layout_alignParentStart="true" android:layout_marginTop="59dp" android:background="#079ED9" android:gravity="left|center" android:padding="25dp" android:text="Name" android:textColor="#ffffff" android:textSize="30sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="@+id/my_toolbar_detail" app:layout_constraintVertical_bias="0.0" tools:layout_editor_absoluteX="0dp" /> <ImageView android:id="@+id/iv_poster" android:layout_width="131dp" android:layout_height="163dp" android:layout_alignStart="@+id/my_toolbar_detail" android:layout_below="@+id/title_name" android:layout_marginBottom="15dp" android:layout_marginRight="8dp" android:layout_marginTop="15dp" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:srcCompat="@mipmap/ic_launcher" /> <Button android:id="@+id/bt_mark_as_fav" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/iv_poster" android:layout_alignParentEnd="true" android:layout_marginBottom="11dp" android:layout_marginEnd="50dp" android:background="#079ED9" android:text="Mark As \n Favorite" android:textSize="10dp" /> <TextView android:id="@+id/tv_runTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/tv_rating" android:layout_below="@+id/tv_releaseDate" android:layout_marginTop="11dp" android:text="TextView" android:textSize="20sp" /> <TextView android:id="@+id/tv_releaseDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/tv_runTime" android:layout_alignTop="@+id/iv_poster" android:text="TextView" android:textSize="25dp" /> <TextView android:id="@+id/tv_rating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignStart="@+id/bt_mark_as_fav" android:layout_below="@+id/tv_runTime" android:layout_marginTop="11dp" android:text="TextView" /> <TextView android:id="@+id/tv_overview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/iv_poster" android:layout_centerHorizontal="true" android:layout_marginBottom="5dp" android:foregroundGravity="center" android:text="adasdasdfadfsasdfasdfasdfasdfnb agfjuanfalsbdfjbdfklbdnfkjasbnf;kasbdnf;kbdfas;kdjabnf;lbdnfo;aidsnfl';asdfj'plasdfj'pdaskjf'asfj'p[asdfk" android:textColor="#000000" /> <RelativeLayout android:id="@+id/foodItemActvity_linearLayout_fragments" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@+id/tv_overview"> <TextView android:id="@+id/fragment_dds_review_textView_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Reviews:" android:textAppearance="?android:attr/textAppearanceMedium" /> <com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView android:id="@+id/expandable_listview" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:layout_below="@+id/fragment_dds_review_textView_label" android:padding="8dp"> </com.github.paolorotolo.expandableheightlistview.ExpandableHeightListView> </RelativeLayout> </RelativeLayout> </ScrollView> 

这是以前提到的许多解决scheme之一replace我的列表之后。 所以问题是,由于在android中的2 scrollview错误(也许不是一个bug),listview是不正确的行为。

我用回收站视图取代了我的最终布局。

这是我的回收视图适配器:

 public class TrailerAdapter extends RecyclerView.Adapter<TrailerAdapter.TrailerAdapterViewHolder> { private ArrayList<String> Youtube_URLS; private Context Context; public TrailerAdapter(Context context, ArrayList<String> Youtube_URLS){ this.Context = context; this.Youtube_URLS = Youtube_URLS; } @Override public TrailerAdapter.TrailerAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.trailer_layout, parent, false); return new TrailerAdapterViewHolder(view); } @Override public void onBindViewHolder(TrailerAdapter.TrailerAdapterViewHolder holder, int position) { Picasso.with(Context).load(R.drawable.ic_play_arrow_black_24dp).into(holder.iv_playbutton); holder.item_id.setText(Youtube_URLS.get(position)); } @Override public int getItemCount() { if(Youtube_URLS.size()==0){ return 0; }else{ return Youtube_URLS.size(); } } public class TrailerAdapterViewHolder extends RecyclerView.ViewHolder { ImageView iv_playbutton; TextView item_id; public TrailerAdapterViewHolder(View itemView) { super(itemView); iv_playbutton = (ImageView)itemView.findViewById(R.id.play_button); item_id = (TextView)itemView.findViewById(R.id.tv_trailer_sequence); } } } 

这是我的RecyclerView自定义布局:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="56dp" android:padding="6dip" > <ImageView android:id="@+id/play_button" android:layout_width="70dp" android:layout_height="wrap_content" android:layout_marginRight="6dip" android:layout_marginStart="12dp" android:src="@drawable/ic_play_arrow_black_24dp" android:layout_centerVertical="true" android:layout_alignParentStart="true" /> <TextView android:id="@+id/tv_trailer_sequence" android:layout_width="wrap_content" android:layout_height="26dip" android:layout_centerVertical="true" android:layout_toEndOf="@+id/play_button" android:ellipsize="marquee" android:gravity="center" android:maxLines="1" android:text="Description" android:textSize="12sp" /> </RelativeLayout> 

和VOILA,我得到了一个scollview中的ListView(Now RecyclerView)所需的效果。 下面是UI的最终形象

最后一点,我相信replaceRecyclerView对我来说是一个更好的select,因为它提高了整体应用程序的稳定性,也帮助我更好地理解了RecyclerView。 如果我要提出一个解决scheme,我要说用一个RecyclerViewreplace你的ListView。

根据我,当你使用setOnTouchListener父母或孩子停止滚动的父母,当你触摸孩子,否则停止滚动的孩子,因为你触摸父母

使用这个方法,你的listview可以在scrollview里滚动:

  ListView lstNewsOffer.setAdapter(new ViewOfferAdapter( ViewNewsDetail.this, viewOfferList)); getListViewSize(lstNewsOffer); void getListViewSize(ListView myListView) { ListAdapter myListAdapter = myListView.getAdapter(); if (myListAdapter == null) { // do nothing return null return; } // set listAdapter in loop for getting final size int totalHeight = 0; for (int size = 0; size < myListAdapter.getCount(); size++) { View listItem = myListAdapter.getView(size, null, myListView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } // setting listview item in adapter ViewGroup.LayoutParams params = myListView.getLayoutParams(); params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); myListView.setLayoutParams(params); // print height of adapter on log Log.i("height of listItem:", String.valueOf(totalHeight)); } 

尝试与ScrollView,而不是与ListView。

 public class xScrollView extends ScrollView { ; ; @Override public boolean onInterceptTouchEvent (MotionEvent ev) { return false; } } 

requestDisallowInterceptTouchEvent(boolean disallowIntercept)

当孩子不想让这个父母及其祖先用onInterceptTouchEvent(MotionEvent)拦截触摸事件时调用。 这个家长应该把这个电话转给父母。 这个家长必须在接触期间服从这个要求(也就是说,只有在这个家长收到了一个或一个取消之后才清除这个标记。

试试这个答案,

  listview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Disallow the touch request for parent scroll on touch of child view scrollView.requestDisallowInterceptTouchEvent(true); int action = event.getActionMasked(); switch (action) { case MotionEvent.ACTION_UP: scrollView.requestDisallowInterceptTouchEvent(false); break; } return false; } }); 

用ScrollView里的RecycleViewreplaceListView。 它运行平稳,无需额外的源代码:

  <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.hung.recycleviewtest.MainActivityFragment" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view" android:layout_width="match_parent" android:layout_height="400dp" android:background="@android:color/darker_gray"/> <android.support.v7.widget.RecyclerView android:id="@+id/recycle_view_a" android:layout_marginTop="40dp" android:layout_below="@id/recycle_view" android:layout_width="match_parent" android:layout_height="400dp" android:background="@android:color/darker_gray"/> </RelativeLayout> </ScrollView> 

对于ScrollView里面的ListView,使用NestedScrollView可以非常方便地处理这个function:

 <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dip"/> </LinearLayout> </android.support.v4.widget.NestedScrollView> 

我有这个错误。我的解决scheme如下:

1.创build一个不可滚动的自定义列表视图

 public class NonScrollListView extends ListView { public NonScrollListView(Context context) { super(context); } public NonScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } public NonScrollListView(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(); } 

}

2.使用上面的自定义类为XML文件

  <com.Example.NonScrollListView android:id="@+id/lv_nonscroll_list" android:layout_width="match_parent" android:layout_height="wrap_content" > </com.Example.NonScrollListView> 

希望最适合你。

我find了一个解决scheme, 而不是使用scrollview,你可以使用addHeaderview和addFooterview的列表视图

这是我的片段,

 // create separate layout and add it dynamically scrollview=getLayoutInflater().inflate(R.layout.yourlayout,null); lv=(ListView)listview.findViewById(R.id.listView2); lv.addHeaderView(scrollview); lv.setContentView(lv); 

现在,与列表视图您的布局也可以滚动。 好好享受!!!

不要给ListView滚动视图,因为它有该设置默认

 <ListView android:cacheColorHint="#00000000" android:id="@+id/ListView01" android:layout_height="wrap_content" android:layout_width="fill_parent" /> 

你不能在滚动视图中添加一个ListView,因为列表视图也会出现滚动,并且在ListView滚动和滚动视图Scoll之间会出现同步问题。 您可以创build一个CustomList视图并将其添加到该视图中。

 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* * Prevent parent controls from stealing our events once we've gotten a touch down */ if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { ViewParent p = getParent(); if (p != null) { p.requestDisallowInterceptTouchEvent(true); } } return false; } 

Demo_ListView_In_ScrollView

==============================

  package com.app.custom_seekbar; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class Demo_ListView_In_ScrollView extends Activity { ListView listview; ArrayList<String> data=null; listview_adapter adapter=null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); super.setContentView(R.layout.demo_listview_in_scrollview_activity); init(); set_data(); set_adapter(); } public void init() { listview=(ListView)findViewById(R.id.listView1); data=new ArrayList<String>(); } public void set_data() { data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); data.add("Meet"); data.add("prachi"); data.add("shailesh"); data.add("manoj"); data.add("sandip"); data.add("zala"); data.add("tushar"); } public void set_adapter() { adapter=new listview_adapter(Demo_ListView_In_ScrollView.this,data); listview.setAdapter(adapter); Helper.getListViewSize(listview); // set height of listview according to Arraylist item } } 

========================

listview_adapter

==========================

  package com.app.custom_seekbar; import java.util.ArrayList; import android.app.Activity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; public class listview_adapter extends ArrayAdapter<String> { private final Activity context; ArrayList<String>data; class ViewHolder { public TextView tv_name; public ScrollView scroll; public LinearLayout l1; } public listview_adapter(Activity context, ArrayList<String> all_data) { super(context, R.layout.item_list_xml, all_data); this.context = context; data=all_data; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View rowView = convertView; ViewHolder viewHolder; if (rowView == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView = inflater.inflate(R.layout.item_list_xml, null); viewHolder = new ViewHolder(); viewHolder.tv_name=(TextView)rowView.findViewById(R.id.textView1); rowView.setTag(viewHolder); } else viewHolder = (ViewHolder) rowView.getTag(); viewHolder.tv_name.setText(data.get(position).toString()); return rowView; } } 

===================================

Helper class

====================================

  import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.ListView; public class Helper { public static void getListViewSize(ListView myListView) { ListAdapter myListAdapter = myListView.getAdapter(); if (myListAdapter == null) { //do nothing return null return; } //set listAdapter in loop for getting final size int totalHeight = 0; for (int size = 0; size < myListAdapter.getCount(); size++) { View listItem = myListAdapter.getView(size, null, myListView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } //setting listview item in adapter ViewGroup.LayoutParams params = myListView.getLayoutParams(); params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1)); myListView.setLayoutParams(params); // print height of adapter on log Log.i("height of listItem:", String.valueOf(totalHeight)); } } 

========================

demo_listview_in_scrollview_activity.xml

========================

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> </ScrollView> </LinearLayout> 

================

item_list_xml.xml

==================

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:text="TextView" android:textSize="14sp" /> </LinearLayout> 
  • 停止ScrollView从EditText设置焦点
  • ScrollView里面的ScrollView
  • 如何始终显示滚动条
  • ScrollView只能托pipe一个直接的孩子
  • 在android中滚动垂直和水平
  • Android:当ScrollView停止滚动时检测
  • 如何把GridView放入ScrollView
  • 没有重力scrollview。 如何使scrollview内的内容为中心
  • ScrollView里面的Android WebView只滚动scrollview