2017-02-14 9 views
1

親としてスクロールビューがネストされ、その子として2つのrecyclerviewsがあります。リサイクラビューでは、スクロールで描画するのではなく、1回のショットで子どもを描画するという私の問題です。どうすればこれを防ぐことができますか?私が追加した場合、それを読むと、この問題が発生します。しかし、スクロールをスムーズにするためにこのプロパティを追加しました。私のXMLファイルは以下の通りです。nestedscrollviewのRecyclerView動作の問題

<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つのRecyclerViewがある場合は、1つを削除し、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を組み合わせる場合、グリッドスパンロジックを動的に変更する必要があります。それでこのアプローチを選んだ理由 –

関連する問題