2017-02-14 1 views
1

부모로서 중첩 된 scrollview 및 하위 뷰로 2 개의 recyclerviews가 있습니다. 리사이클 러 뷰는 스크롤 할 때 그리는 것이 아니라 한 번에 아이를 그립니다. 이 문제를 어떻게 방지 할 수 있습니까? 나는 우리가 더하면NestedScrollview의 RecyclerView 비헤이비어 문제

android:nestedScrollingEnabled="false" 

재산이 나옵니다. 하지만이 속성을 추가하여 스크롤을 부드럽게 만들었습니다. 아래 주어진 내 XML 파일입니다.

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/color_fafafa" 
     android:orientation="vertical"> 
     <android.support.v7.widget.RecyclerView 
       android:id="@+id/list" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:clipToPadding="false" 
       android:nestedScrollingEnabled="false" 
       android:paddingLeft="@dimen/dp_5" 
       android:paddingRight="@dimen/dp_5" 
       app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 
    </LinearLayout> 
</android.support.v4.widget.NestedScrollView> 

아무도이 문제를 어떻게 해결할 수 있습니까?

+0

휴지통보기 자체 ScrollingView을 구현합니다. scrollview 내부에 recyclerView를 두는 것은 좋은 습관이 아닙니다. –

+0

이 링크를 확인 했습니까? http://stackoverflow.com/questions/31000081/how-to-use-recyclerview-inside-nestedscrollview –

+0

RecyclerView에서 layout_height = "match_parent"설정 –

답변

0

2 명의 RecyclerViews 만 아이들로있는 경우 하나를 제거하고 RecyclerViews ViewType을 사용하는 것이 좋습니다. 당신은 특정 위치에가 있어야보기의 종류를 결정 getItemViewType (INT 위치)의 도움으로

public class ExampleAdapter extends RecyclerView.Adapter<BindableViewHolder> { 

    private static final int VIEW_TYPE_CLASS_A = 0; 
    private static final int VIEW_TYPE_CLASS_B = 1; 

    private List<ClassA> class_a_list; 
    private List<ClassB> class_b_list; 

    public ExampleAdapter(List<ClassA> class_a_list, List<ClassB> class_b_list) { 
     this.class_a_list = class_a_list; 
     this.class_b_list = class_b_list; 
    } 

    @Override 
    public BindableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view; 
     switch (viewType) { 
      case VIEW_TYPE_CLASS_A: 
       view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_class_a, parent, false); 
       return new ClassAHolder(view); 
      default: 
       view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_class_b, parent, false); 
       return new ClassBHolder(view); 
     } 
    } 

    @Override 
    public void onBindViewHolder(BindableViewHolder holder, int position) { 
     if(position < class_a_list.size()) { 
      ((ClassAHolder) holder).bind(class_a_list.get(position)); 
     } else { 
      ((ClassBHolder) holder).bind(class_b_list.get(position - class_a_list.size())); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return class_a_list.size() + class_b_list.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if(position < class_a_list.size()) { 
      return VIEW_TYPE_CLASS_A; 
     } else { 
      return VIEW_TYPE_CLASS_B; 
     } 
    } 
} 

:

이 같은 어댑터를 사용합니다.

그럼 당신은이 같은 ViewHolders를 사용할 수 있습니다

public abstract class BindableViewHolder<T> extends RecyclerView.ViewHolder { 

    public BindableViewHolder(View itemView) { 
     super(itemView); 
    } 

    public abstract void bind(T data); 
} 

public class ClassAHolder extends BindableViewHolder<ClassA> { 

    public ClassAHolder(View itemView) { 
     super(itemView); 
    } 

    @Override 
    public void bind(ClassA data) { 
     // populate your views 
    } 
} 


public class ClassBHolder extends BindableViewHolder<ClassB> { 

    public ClassBHolder(View itemView) { 
     super(itemView); 
    } 

    @Override 
    public void bind(ClassB data) { 
     // populate your views 
    } 
} 
+0

다른 컨트롤도 있습니다. 그리고 붕괴되고 확장되는 논리가 처리 될 필요가 있습니다. 또한 나는 격자 레이아웃 관리자를 사용하고 있습니다. 현재 특정 뷰 유형의 위치를 ​​하드 코딩하여 레이아웃 범위를 처리하고 있습니다. 내가 recyclerviews를 결합하면 내가 그리드 스팬 논리를 동적으로 변경해야합니다. 그게 왜이 방법을 선택했는지 –