2017-02-14 3 views
1

Ich habe eine geschachtelte scrollview als Eltern und 2 Recyclerviews als Kinder. Was mein Problem ist, ist die Recycler-Ansicht, die ihre Kinder auf einmal zeichnet, anstatt auf Scroll zu zeichnen. Wie kann ich das verhindern? Ich lese, dass, wenn wirRecyclerView Verhalten in NestedScrollview

android:nestedScrollingEnabled="false" 

Eigentum hinzufügen, dieses Problem kommt. Aber ich habe diese Eigenschaft hinzugefügt, um das Scrollen weicher zu machen. Unten ist meine XML-Datei angegeben.

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

Kann mir jemand sagen, wie kann ich dieses Problem lösen?

+0

Recycler Ansicht selbst ist implementiert ScrollingView. Eine RecyclerView in eine Scrollview zu stellen, ist keine sehr gute Übung. –

+0

Haben Sie diesen Link überprüft: http://stackoverflow.com/questions/31000081/how-to-use-recyclerview-inside-nestedscrollview –

+0

Set layout_height = "match_parent" im RecyclerView –

Antwort

0

Wenn Sie nur 2 RecyclerViews als Kinder haben, würde ich vorschlagen, eins zu entfernen und RecyclerViews ViewType zu verwenden.

einen Adapter wie diese:

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

Mit Hilfe von getItemViewType (int position) Sie bestimmen, welche Art von Blick dort in der spezifischen Position sein sollte.

Dann können Sie ViewHolders wie diese verwenden:

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

Ich habe auch andere Kontrollen. Und es gibt kollabierende und expandierende Logiken, die gehandhabt werden müssen. Außerdem verwende ich den Grid Layout Manager. Zurzeit bearbeite ich den Layoutbereich, indem ich die Position des jeweiligen Ansichtstyps festdecodiere. Wenn ich Recyclerviews kombiniere, muss ich die Grid-Span-Logik dynamisch ändern. Deshalb entschied sich dieser Ansatz –

Verwandte Themen