ListView不在android中的NestedScrollView内滚动

时间:2016-10-12 10:32:45

标签: android listview

我从使用listview的view pager中夸大了一个片段。并且列表视图不支持前棒棒糖设备中的setNestedScrollingEnabled。所以我在NestedScrollView中添加了listview,但是在滚动列表时它不会滚动。

 <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:id="@+id/fragment_item_view"
    android:background="@color/white"
    android:isScrollContainer="true">

<ProgressBar
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:layout_centerInParent="true" />

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:fillViewport="true">
        <ListView
            android:id="@+id/list_item_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            android:clipToPadding="false"
            android:divider="@color/gray_stroke_color"
            android:dividerHeight="0.5dp"
            android:paddingBottom="@dimen/padding_64dp"                >
        </ListView>

    </android.support.v4.widget.NestedScrollView>

</android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>

任何人都可以向我建议任何解决方案。提前谢谢。

8 个答案:

答案 0 :(得分:4)

尝试使用

setNestedScrollingEnabled(true);

答案 1 :(得分:3)

使用ViewCompat.setNestedScrollingEnabled(),您的问题将得到解决。

答案 2 :(得分:1)

我不确定为什么你会想要在ScrollView中使用ListView,如果它将占用它的父级的整个高度/宽度。

我建议只在片段的根布局中使用ListView并删除ScrollView。

<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <ListView
        android:id="@+id/list_item_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:clipToPadding="false"
        android:divider="@color/gray_stroke_color"
        android:dividerHeight="0.5dp"
        android:paddingBottom="@dimen/padding_64dp"/>

    </ListView>

</android.support.v4.widget.SwipeRefreshLayout>

另外,我建议使用RecyclerView而不是ListView,因为它实现了NestedScrollingChild。

但是如果您在布局中设置了嵌套滚动视图,则需要了解NestedScrollView在列表时用作父滚动视图或子滚动视图。以下是包含2个其他滚动视图的滚动视图的一个很好的示例:

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

<LinearLayout android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical">

    <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="100dp">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

    </android.support.v4.widget.NestedScrollView>

    <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="100dp">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

    </android.support.v4.widget.NestedScrollView>

</LinearLayout>
</ScrollView>

另外,我注意到您可能正在使用CoordinatorLayout,因为您正在设置子视图的布局行为。如果是这样,您只需要指定&#39; app:layout_behavior =&#34; @ string / appbar_scrolling_view_behavior&#34;&#39;对于您的主要和唯一的ScrollView:ListView,RecyclerView或NestedScrollView。

答案 3 :(得分:0)

您必须拦截触摸事件以实现平滑滚动

outerScrollView.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                findViewById(R.id.inner_scroll).getParent()
                        .requestDisallowInterceptTouchEvent(false);
                return false;
            }
        });

        innerScrollView.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                v.getParent().requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

答案 4 :(得分:0)

添加此代码即可正常工作 android:nestedScrollingEnabled =“ true”

 <ExpandableListView
    android:id="@+id/lvExp"
    android:nestedScrollingEnabled="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    />

答案 5 :(得分:0)

yourtListViewName.setNestedScrollingEnabled(true);

答案 6 :(得分:0)

在XML文件中,定义ListView时,请写,

android:nestedScrollingEnabled="true"

它将解决问题

答案 7 :(得分:0)

创建自定义的 NonScrollListView

NonScrollListView.java

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

}

customListView

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
android:fadingEdgeLength="0dp"
android:fillViewport="true"
android:overScrollMode="never"
android:scrollbars="none" >
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <!-- com.Example Changed with your Package name -->

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/lv_nonscroll_list" >
    </RelativeLayout>
</RelativeLayout></ScrollView>

在 Java 文件中

创建一个自定义列表视图的对象,而不是像这样的列表视图: NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list);