滚动浏览中的两个listView在滚动浏览中的滚动光滑



按产品设计,我必须在滚动浏览中有两个列表视图。我正在使用reyclerviews代替ListViews。正如您可能想象的那样,滚动体验非常懒惰。我能够通过为我的两个recyclerviews设置NestedScrollingEnabled(false)来解决滞后问题。

rv1.setNestedScrollingEnabled(false);
rv2.setNestedScrollingEnabled(false);

我遇到的冲突是嵌套滚动是API 21 的功能。早期API版本的等效代码是什么?

我尝试了以下内容,但是列表项目不可单击。滚动非常平稳。

rv1.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
      return true;
   }
});
rv2.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
      return true;
   }
});

我尝试调整代码,以便可以单击我的项目,因此我将代码更新为以下内容,但是,现在光滑的滚动已消失,但我的项目可单击。

rv1.setOnTouchListener(new View.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(false);
            break;
         case MotionEvent.ACTION_UP:
            // allow scrollview to intercept touch events
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;
      v.onTouchEvent(event);
      return true;
   }
});

rv2.setOnTouchListener(new View.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(false);
            break;
         case MotionEvent.ACTION_UP:
            // allow scrollview to intercept touch events
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;
      v.onTouchEvent(event);
      return true;
   }
});

我认为这可能是我的XML结构化的方式,父母实际上是线性层植物包装器,而不是滚动浏览器,尽管这只是我的理论。我已经发布了下面XML的结构。

<ScrollView
        android:id="@+id/sv"
        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.v7.widget.CardView
            ....
            ....
            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:divider="@null"
                android:overScrollMode="never"
                android:scrollingCache="false"/>
            </android.support.v7.widget.CardView>
    </LinearLayout>
  </ScrollView>

对此的任何帮助将不胜感激,谢谢!

我能够解决问题。ScrollViews内部的ListView如此慢,而Laggy的列表视图主要是由于每个相应的视图中启用了多个滚动。如果您可以消除ListView或ScrollView的滚动,则所有内容都会更顺畅(不要与最光滑的混淆。它不是优化的)。这就是我所做的。

我添加了一个条件,该条件使用了API 21的嵌套滚动属性,在其他条件下,我明确设置了在CustomRecyClerview类中禁用滚动的条件。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // disable nested scrolling
        rvAirportNearest.setNestedScrollingEnabled(false);
        rvAirportServiced.setNestedScrollingEnabled(false);
    } else {
        // disable scrolling
        rvAirportNearest.setScrollingEnabled(false);
        rvAirportServiced.setScrollingEnabled(false);
    }

这是我的自定义回收器视图类

public class CustomScrollableRecyclerView extends RecyclerView {
    private boolean isScrollable = true; // by default recycler view is scrollable
    /**
     * Constructor
     * @param context
     */
    public CustomScrollableRecyclerView(Context context) {
        super(context);
    }
    /**
     * Constructor
     * @param context
     * @param attrs
     */
    public CustomScrollableRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    /**
     * Constructor
     * @param context
     * @param attrs
     * @param defStyle
     */
    public CustomScrollableRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    public int computeVerticalScrollRange() {
        if (isScrollable()) {
            return super.computeVerticalScrollRange();
        }
        return 0;
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        if(isScrollable()) {
            return super.onInterceptTouchEvent(e);
        }
        return false;
    }
    /**
     * Method is used to set scrolling enabled
     * @param enabled
     */
    public void setScrollingEnabled(boolean enabled) {
        isScrollable = enabled;
    }
    /**
     * Method is used to check if scrolling is enabled
     * @return true if scrolling is possible, otherwise false
     */
    public boolean isScrollable() {
        return isScrollable;
    }
}

希望这将帮助其他人面临同一问题。

最新更新