在嵌套Scrollview滚动内的Recyclerview,但不像普通的Recyclerview或Nested Scrollview那样快速滚动

时间:2016-05-18 13:54:26

标签: android android-recyclerview android-nestedscrollview

我在RecyclerView内使用NestedScrollView并且它有效。但是当我在RecyclerView内部使用LinearLayout时,它会根据手势以不同的速度滚动。滚动听手势,如果我只滑了一下,那么滚动一点,如果我快速向上滑动,那么它滚动得非常快。现在我的问题是RecyclerViewNestedScrollView肯定滚动但快速滚动不起作用。但是我快速或慢速向上滑动,RecyclerViewNestedScrollView只会滚动一点点。

如何让滚动视图中的NestedScrollViewRecyclerView以不同的速度滚动?

11 个答案:

答案 0 :(得分:252)

recyclerView.setNestedScrollingEnabled(false);

答案 1 :(得分:50)

默认情况下,setNestedScrollingEnabled仅适用于API-21。

您可以使用ViewCompat.setNestedScrollingEnabled(recyclerView, false);禁用API-21(Lollipop)之前和之后的嵌套滚动。 Link to documentation

希望这有帮助!

答案 2 :(得分:21)

我正在使用android 16,这是不可能使用setNestedSCrollEnabled方法的,

我最终做了什么来阻止RecyclerView处理Scrolls。

就像在LinerLayoutManager中我做了canScrollHorizo​​ntally,canScrollVertically默认返回false。

 @Override
    public void onMapReady(GoogleMap googleMap) {
        map =googleMap;
        map.getUiSettings().setZoomControlsEnabled(true);


        for (Taxi taxi : taxis) {
            u= taxi.getUbicacionActual();
            LatLng ubicacion= new LatLng(Double.parseDouble(u.getLatitud()), Double.parseDouble(u.getLongitud()));


            map.moveCamera(CameraUpdateFactory.newLatLngZoom(ubicacion,15));

            MarkerOptions punto= new MarkerOptions().position(ubicacion);
            map.addMarker(punto);

            map.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                @Override
                public View getInfoWindow(Marker marker) {

                    return null;
                }

                @Override
                public View getInfoContents(Marker marker) {
                    View v = getLayoutInflater().inflate(R.layout.info_title, null);


                    TextView info1 = (TextView) v.findViewById(R.id.info1);
                    TextView info2 = (TextView) v.findViewById(R.id.info2);
                    TextView info3 = (TextView) v.findViewById(R.id.info3);

                    info1.setText("Fecha: " + u.getFecha());
                    info3.setText("Longitud: " + u.getLongitud().toString());

                    info2.setText("Ubicacion: "+obtenerDireccion(u.getLatitud(),u.getLongitud()));

                    return v;
                }
            });


        }
        map.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {

                Fragment fragmento;
                fragmento = new HistorialFragment();
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.content_principal, fragmento)
                        .commit();


            }
        });

答案 3 :(得分:5)

经过几次迭代,我想出了一个解决方案。

  1. 如果您使用的是RecyclerView,那么:

    recyclerView.setNestedScrollingEnabled(false);
    
  2. 如果您在NestedScrollingView中使用LinearLayout,请将LinearLayout放在普通的ScrollView中,然后将其滚动设置为

    scrollView.setNestedScrollingEnabled(false);
    

答案 4 :(得分:1)

android:overScrollMode =“从不

  <android.support.v4.widget.NestedScrollView
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never">


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

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

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

答案 5 :(得分:0)

您可以使用ScrollView和ExtendRecyclerView类来覆盖onMeasure方法。这对我有用!

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, expandSpec);
}

答案 6 :(得分:0)

recyclerView.setNestedScrollingEnabled(false);

有时会很有用。但不建议所有时间。因为它会在重定时器视图中禁用视图回收功能。

备选方案:

使用Recycler视图尝试使用CollapsiveToolbarLayout。 将其他视图放在collapsiveTollbar布局中。

答案 7 :(得分:0)

我也遇到了这个问题。 并升级到26.1.0修复它。

答案 8 :(得分:0)

在“我的情况”下,我将所有图像放置在可绘制文件夹中,该文件夹中放置了drawable-xxxhdpi文件夹,这就是我的屏幕界面滞后的原因。

答案 9 :(得分:-2)

这是WAI。 NestedScrollView使用Spec“Unspecified”测量其子项。孩子也可以随心所欲地成长。

这基本上等同于NSV和RV的高度。因此就RV而言,它认为它完全显示出来。

用LL包裹你的房车并给你的房车高度。 LL不会将测量规范设置为非标准,因此RV将在您提供的任何DP的设定高度内正确滚动。

此方法的唯一缺点是您无法在RV上执行匹配父项。

答案 10 :(得分:-4)

您应该在任何布局(如LinearLayout)中包装Recycler视图,并将RecyclerView大小设置为常量,如800dp。这样可以在滚动过程中实现平滑滚动和循环播放器视图。

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:orientation="vertical">

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

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="800dp"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</LinearLayout>