2016-05-23 3 views
17

У меня есть макет так:NestedScrollView не броситься с Recyclerview внутри

<NestedScrollView> 
    <RecyclerView> // vertical recycler view 
      <RecyclerView/> // horizontal recycler view 
      <RecyclerView/> 
      <RecyclerView/> 
      ... 
    <RecyclerView> 
</NestedScrollView> 

Результат выглядит в Google Play Маркете: enter image description here

И я отключил NestedScrolling в horizontal Recycler зрения:

horizontalRecyclerView.setHasFixedSize(true); 
horizontalRecyclerView.setNestedScrollingEnabled(false); 

Моя проблема:

vertical recyclerview не прокручивается, когда ACTION_UP происходит, vertical recyclerview также останавливает прокрутку.

Как я могу гнездо vertical recyclerview внутри nestedscrollview и horizontal recyclerview внутри vertical recyclerview как Playstore и держать свиток гладкой.

Решено:

Использование пользовательских вложенной вид прокрутки @vrund Пурохит (код ниже), и инвалидов nestedscroll как вертикальные, так и горизонтальные recyclerview:

verticalRecyclerView.setNestedScrollingEnabled(false); 
... add each horizontal recyclerviews: 
horizontalRecyclerView.setNestedScrollingEnabled(false); 
+0

https://stackoverflow.com/questio ns/27083091/recyclerview-inside-scrollview-is-not-working/45466603 # 45466603 Проверьте эту ссылку .. – maruti060385

ответ

8

У меня была такая же проблема, и я решил эту проблему путем настройки NeatedScrollView.

Это класс для этого.

MyNestedScrollView

public class MyNestedScrollView extends NestedScrollView { 
    @SuppressWarnings("unused") 
    private int slop; 
    @SuppressWarnings("unused") 
    private float mInitialMotionX; 
    @SuppressWarnings("unused") 
    private float mInitialMotionY; 
    public MyNestedScrollView(Context context) { 
     super(context); 
     init(context); 
    } 
    private void init(Context context) { 
     ViewConfiguration config = ViewConfiguration.get(context); 
     slop = config.getScaledEdgeSlop(); 
    } 
    public MyNestedScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
    } 
    public MyNestedScrollView(Context context, AttributeSet attrs, 
      int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context); 
    } 
    private float xDistance, yDistance, lastX, lastY; 
    @SuppressWarnings("unused") 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     final float x = ev.getX(); 
     final float y = ev.getY(); 
     switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      // This is very important line that fixes 
      computeScroll(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) { 
       return false; 
      } 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 
    public interface OnScrollChangedListener { 
     void onScrollChanged(NestedScrollView who, int l, int t, int oldl, 
       int oldt); 
    } 
    private OnScrollChangedListener mOnScrollChangedListener; 
    public void setOnScrollChangedListener(OnScrollChangedListener listener) { 
     mOnScrollChangedListener = listener; 
    } 
    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 
     if (mOnScrollChangedListener != null) { 
      mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); 
     } 
    } 
} 

Днем кодирования.

+0

https: // stackoverflow.ком/вопросы/27083091/recyclerview-внутри-Scrollview-это-не-работают/45466603 # 45466603 – maruti060385

+1

Есть ли какое-либо преимущество над простым ответом [ниже] (https://stackoverflow.com/a/43536382/905686)? Если нет, подумайте о том, чтобы принять более простой. – user905686

4

[RESOLVED] У меня такая же проблема с Горизонтальным recycleview. Change Gradle repo for recycleview

compile 'com.android.support:recyclerview-v7:23.2.1' Напиши это: linearLayoutManager.setAutoMeasureEnabled (true);

Исправлены ошибки, связанные с различными методами измерения спекуляции в обновлении

Проверить http://developer.android.com/intl/es/tools/support-library/features.html#v7-recyclerview

Я нашел вопрос с 23.2.1 библиотека: Когда деталь match_parent вид рециркуляционного заполнить полный элемент для просмотра, пожалуйста, всегда идут с минимальной высотой или «wrap_content».

Благодаря

33

Используйте ниже код для плавной прокрутки:

ViewCompat.setNestedScrollingEnabled(recyclerView, false); 
+0

Спасибо! Работает отлично. –

+0

Это работает, и это просто. Благодаря ! –

+0

положите его в свой 'MainActivity.onCreate' или где бы вы ни создали свой recyclerView – Cano64

1

Я решил эту проблему с помощью кода ниже:

 myRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false){ 
     @Override 
     public boolean canScrollHorizontally() { 
      return true; 
     } 

     @Override 
     public boolean canScrollVertically() { 
      return true; 
     } 
    }); 
3

Добавить это в RecyclerView XML:

android:nestedScrollingEnabled="false" 
+0

Это работает только для уровня API 21 и выше для уровня API ниже уровня 21 см. Ответ Kuldeeps. –

+0

Если вы используете привязку данных в своем макете, вы также можете создать привязку для привязки: @BindingAdapter («nestedScrollingEnabled») public static void setNestedScrollingEnabled (окончательный просмотр, конечное логическое значение) { ViewCompat.setNestedScrollingEnabled (view, value); }, а затем добавить в макеты с помощью приложения: nestedScrollingEnabled = "@ {false}" –

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