2014-11-28 5 views
9

In meiner Anwendung verwende ich TabHost Activiy.In Tabhost ersten Tab verwende ich TabActivity, ich lade mehr als 500 Bilder.Recyclerview in verschachtelten Bildlaufansicht Laden aller Daten anstelle des Aufrufs eines Bildes beim Scrollen

mit geschachtelten Ansicht blättern:

ich verschachtelte Bildlaufansicht verwendet haben innerhalb recyclerview.When die Homepage geladen wird, wird das Laden alle 500 Bilder zunächst, dann zeigt das Haus page.So, dass es Ursache Speicher aus Fehler.

Ohne verschachtelte Bildlaufansicht mit:

Wenn ich verschachtelte Scroll-Ansicht entfernen, alles funktioniert good.it Lasten Bild eines nach dem anderen, wenn scrolling.it verursacht nicht aus Speicherfehler.

Meine Forderung:

Ich brauche die relative Layout platziert oben auf der recyclerview.So blättern, die ich verschachtelte Scroll verwenden view.But es nicht für mich gearbeitet.

tab_home_layout:

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v4.widget.NestedScrollView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 

     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    > 

<LinearLayout 
    android:id="@+id/tab_home_activity" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    > 

     <RelativeLayout 
      android:id="@+id/home_layout_top_2_recycler" 
      android:layout_width="match_parent" 
      android:layout_height="60dp" 
      android:background="@drawable/layout_border" 
      > 

      <ImageView 
       android:id="@+id/img_user_home_tab_recycler" 
       android:layout_width="40dp" 
       android:layout_height="40dp" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:layout_centerVertical="true" 
       android:contentDescription="@string/cont_desc" 
       android:src="@drawable/profile_pic_blue" /> 

      <TextView 
       android:id="@+id/tv_user_mind_home_tab_recycler" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_centerVertical="true" 
       android:layout_marginLeft="5dp" 
       android:layout_toRightOf="@+id/img_user_home_tab_recycler" 
       android:hint="@string/whats_on" 
       android:textColor="@color/Black" 
       android:textSize="@dimen/txt_size" /> 
     </RelativeLayout> 

    <android.support.v7.widget.RecyclerView 
      android:id="@+id/rv_list_tab_home_recycler" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:scrollbars="none" 
      android:visibility="visible" /> 

    </LinearLayout> 
</android.support.v4.widget.NestedScrollView> 

Im Folgenden werde ich bereit bin zu teilen, was ich bisher ausprobiert.

  • ich versucht, dieses SO Post .Aber Ich verwende Homepage innerhalb tabActivity.So ich nicht Toolbar + Koordinator layout.So this solution nicht für mich gearbeitet verwenden wurde.

  • Dann habe ich versucht multiple layout für recyclerview.But zu verwenden, die nicht für me.Because hat gearbeitet, dass relativelayout ein statisch ist one.If ich jede Bedingung aus webservice Mittel bin immer ich mehrere Layout verwenden können Recyclerview.Aber ich brauche , um nur die Ansichten zu scrollen.

  • ich geplant, um die statische relativelayout in der 0. Position adapter.But meine webservices Bilder eingestellt wurden von der 0. position.So ich lade kann die statische relativelayout in Adapter an der 0. Position nicht festgelegt.

gibt es alternative Lösung, um dieses Problem zu lösen.Vielen Dank.

+0

Haben Sie versucht, 'requestDisallowInterceptTouchEvent()' aus der verschachtelten Ansicht aufzurufen, wenn das Scrollen beginnt? Mehr Infos hier: https://developer.android.com/reference/android/view/ViewGroup.html#requestDisallowInterceptTouchEvent(boolean) und hier: https://developer.android.com/training/gestures/viewgroup.html – milosmns

+0

Btw Vielleicht möchten Sie die Idee der Verwendung von TabActivity überdenken, wie es vor einiger Zeit veraltet wurde https://developer.android.com/reference/android/app/TabActivity.html – milosmns

+0

@milosmns lassen Sie mich requestDisallowInterceptTouchEvent() und überprüfen Sag ich dir später. – Steve

Antwort

8

Sie CoordinatorLayout über irgendwo Sie wie ähnlich wie andere Layouts wie LinearLayout oder sogar RelativeLayout verwenden können.Wenn Sie Ihre RelativeLayout als Antwort auf Ihre RecyclerView scrollen möchten, legen Sie sie einfach in eine CoordinatorLayout mit einer AppBarLayout. Hier ist Ihr Layout geändert:

<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <RelativeLayout 
      android:id="@+id/home_layout_top_2_recycler" 
      android:layout_width="match_parent" 
      android:layout_height="60dp" 
      android:background="@drawable/layout_border" 
      app:layout_scrollFlags="scroll"> 

      <ImageView 
       android:id="@+id/img_user_home_tab_recycler" 
       android:layout_width="40dp" 
       android:layout_height="40dp" 
       android:paddingLeft="5dp" 
       android:paddingRight="5dp" 
       android:layout_centerVertical="true" 
       android:contentDescription="@string/cont_desc" 
       android:src="@drawable/profile_pic_blue" /> 

      <TextView 
       android:id="@+id/tv_user_mind_home_tab_recycler" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_centerVertical="true" 
       android:layout_marginLeft="5dp" 
       android:layout_toRightOf="@+id/img_user_home_tab_recycler" 
       android:hint="@string/whats_on" 
       android:textColor="@color/Black" 
       android:textSize="@dimen/txt_size" /> 
      </RelativeLayout> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_list_tab_home_recycler" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="none" 
     android:visibility="visible" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

</android.support.design.widget.CoordinatorLayout> 

ändert es nach Ihren Wünschen, aber sicher sein, die layout_height der RelativeLayout auf etwas anderes als wrap_content einzustellen.

Wenn diese CoordinatorLayout innerhalb eines anderen CoordinatorLayout ist, verwenden Sie die NestedCoordinatorLayout von diesem answer als innerhalb CoordinatorLayout.

+0

Ich probierte diese Lösung, es scrollt nicht das relative Layout. Sie können mein Layout [hier] (http://pastie.org/private/tqzfm4b16q0l08nkypfsxa) überprüfen. Ich habe keine verschachtelte Scrollview verwendet. – Steve

+1

Sie haben 'app: layout_scrollFlags =" scroll "nicht in Ihr' RelativeLayout' eingeschlossen. Es ist sehr wichtig. Fügen Sie außerdem 'app: layout_behavior =" @ string/appbar_scrolling_view_behavior "' zu Ihrem 'RecyclerView' hinzu. – razzledazzle

+0

Ihre Lösung arbeitet für mich in Profilseite ähnlich wie Instagram ohne verschachtelte Bildlaufansicht.In dieser Profilseite kann ich nicht mehrere Layout in Recyclerview Adapter .Diese Lösung half mir in einer kritischen Situation.Willig, Kopfgeld für 500 zu belohnen. Danke. – Steve

5

Die wichtige ist in onBindViewHolder Sie sollten das Bild von Ihrem Webservice von Position-1 laden.
Dies ist ein Beispiel von here und Ihrem Fall in der Header ist Ihre statische RelativeLayout

public class HeaderAdapter extends RecyclerView.Adapter <RecyclerView.ViewHolder> { 
    private static final int TYPE_HEADER = 0; 
    private static final int TYPE_ITEM = 1; 
    String[] data; 

    public HeaderAdapter(String[] data) { 
     this.data = data; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == TYPE_ITEM) { 
      //inflate your layout and pass it to view holder 
      return new VHItem(null); 
     } else if (viewType == TYPE_HEADER) { 
      //inflate your layout and pass it to view holder 
      return new VHHeader(null); 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof VHItem) { 
      String dataItem = getItem(position); 
      //cast holder to VHItem and set data 

      // ***********  
      // LOAD YOUR WEBSERVICE IMAGE FROM **position - 1** 
      // => for row 1 you will get the image 0 ... 
      // *********** 


     } else if (holder instanceof VHHeader) { 
      //cast holder to VHHeader and set data for header. 
     } 
    } 

    //increasing getItemcount to 1. This will be the row of header. 
    @Override 
    public int getItemCount() { 
     return data.length + 1; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (isPositionHeader(position)) 
      return TYPE_HEADER; 

     return TYPE_ITEM; 
    } 

    // condition for header 
    private boolean isPositionHeader(int position) { 
     return position == 0; 
    } 

    // getItem -1 because we have add 1 header 
    private String getItem(int position) { 
     return data[position - 1]; 
    } 

    class VHItem extends RecyclerView.ViewHolder { 
     TextView title; 

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

    class VHHeader extends RecyclerView.ViewHolder { 
     Button button; 

     public VHHeader(View itemView) { 
      super(itemView); 
     } 
    } 
} 
+0

@Stephen haben Sie meine Lösung versucht? mit Ihrem erklären, ich denke, es kann Ihnen helfen, aber wenn Sie mehr Anforderung haben, erklären Sie bitte mehr –

+1

sure.now ich versuche, dass eine und lassen Sie wissen – Steve

+0

Ihre Lösung funktioniert perfekt.Vielen Dank. – Steve