2016-06-24 2 views
0

По дизайну продукта у меня есть два списка в прокрутке. Вместо списков я использую reyclerviews. Опыт прокрутки очень медленный, как вы могли себе представить. Я смог решить проблему с задержкой, установив NestedScrollingEnabled (false) для обоих моих recyclerviews.Плавная прокрутка с двумя списками внутри прокрутки

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

Конфликт, с которым я столкнулся, заключается в том, что NestedScrolling - это функция для 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 структурирована, родитель на самом деле оболочка LinearLayout и не Scrollview, хотя это только моя теория. Я опубликовал, как 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> 

Любая помощь с этим была бы оценена, спасибо заранее!

ответ

0

Я смог решить проблему. Причина, по которой listviews внутри scrollviews настолько медленная, и отставание в основном связано с возможностью множественной прокрутки в каждом соответствующем представлении. Если вы можете исключить прокрутку для списка или прокрутки, все будет работать более плавно (не путать с самым плавным, это не оптимизация). Итак, вот что я сделал.

Я добавил условие, в котором используется атрибут вложенной прокрутки для API 21, а в условии else я явно устанавливаю прокрутку в классе 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; 
    } 

} 

Надеюсь, это поможет другим, с которыми сталкивается тот же вопрос.

Смежные вопросы