按产品设计,我必须在滚动浏览中有两个列表视图。我正在使用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;
}
}
希望这将帮助其他人面临同一问题。