2017-02-14 61 views
1

我有一個嵌套滾動視圖作爲父項,2個recyclerviews作爲其子項。回收者視圖的問題是一次性繪製它的孩子,而不是繪製滾動。我怎樣才能防止這一點。我讀到,如果我們添加嵌套滾動視圖中的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。將scrolllerView放在滾動視圖中並不是一個很好的做法。 –

+0

您是否檢查此鏈接:http://stackoverflow.com/questions/31000081/how-to-use-recyclerview-inside-nestedscrollview –

+0

設置layout_height =「match_parent」在RecyclerView –

回答

0

如果您只有2個RecyclerView作爲子項,我會建議刪除一個,然後使用RecyclerViews ViewType。

使用這樣的適配器:

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; 
     } 
    } 
} 

隨着getItemViewType(INT位置)可以幫助您確定哪種類型的觀應該有具體的位置。

然後你可以使用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我必須動態地更改網格跨度邏輯。這就是爲什麼選擇這種方法 –