2014-11-28 7 views
9

W mojej aplikacji używam tabHost Activiy. W pierwszej karcie tabhost używam TabActivity, ładuję ponad 500 obrazy.Widok Recycler wewnątrz zagnieżdżonego widoku przewijania ładowanie wszystkich danych zamiast wywoływania jednego po jednym obrazie podczas przewijania

Korzystanie Zagnieżdżony przewijać widok:

Użyłem zagnieżdżony widok przewijania wewnątrz recyclerview.When załadowaniu strony głównej, to jest ładowanie wszystkich obrazów początkowo 500, a następnie pokazano dom page.So że to przyczyna pamięci out błędu.

Bez użycia zagnieżdżonych widoku przewiń:

Jeśli usunąć zagnieżdżony widok przewijania, wszystko działa ładunki good.it wizerunek jeden po drugim, gdy scrolling.it nie powoduje z błędem pamięci.

Moja Wymagania:

muszę przewijać względny układ umieszczony szczyt recyclerview.So że użyłem zagnieżdżony zwój view.But nie pracował dla mnie.

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> 

Poniżej jestem gotów podzielić co starałem tak daleko.

  • Próbowałem to SO Post .Ale Używam stronę główną wewnątrz tabActivity.So Nie mogę korzystać z paska narzędzi + koordynator layout.So this solution nie pracował dla mnie.

  • Potem próbował użyć multiple layout dla recyclerview.But że nie pracował me.Because że relativelayout jest statyczną one.If dostaję żadnego warunku z pomocą WebService, mogę korzystać z wielu układ recyclerview.Ale potrzebuję do przewijania widoków.

  • planowałem ustawić statyczny relativelayout w 0th pozycji adapter.But moich sieciowe obrazów ładowali od 0th position.So I nie można ustawić statyczny relativelayout w adapterze na 0th pozycji.

jest jakieś alternatywne rozwiązanie, aby rozwiązać ten problem. Dziękuję.

+0

Czy próbowałeś wywołać 'requestDisallowInterceptTouchEvent()' z zagnieżdżonego widoku, gdy rozpoczyna się przewijanie? Więcej informacji tutaj: https://developer.android.com/reference/android/view/ViewGroup.html#requestDisallowInterceptTouchEvent(boolean) i tutaj: https://developer.android.com/training/gestures/viewgroup.html – milosmns

+0

Btw Być może chciałbyś przemyśleć pomysł użycia TabActivity, ponieważ został on nieaktualny jakiś czas temu https://developer.android.com/reference/android/app/TabActivity.html – milosmns

+0

@milosmns pozwól mi sprawdzić requestDisallowInterceptTouchEvent() i powiem Ci później. – Steve

Odpowiedz

8

Można użyć CoordinatorLayout dosłownie wszędzie podoba Ci się podobna do innych układów, takich jak LinearLayout lub nawet RelativeLayout.Jeśli chcesz, aby Twój RelativeLayout przewijał się w odpowiedzi na twoje RecyclerView, po prostu umieść je wewnątrz CoordinatorLayout z AppBarLayout. Oto twój układ modyfikowany:

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

zmienić go do swoich preferencji, ale pamiętaj, aby ustawić layout_height o RelativeLayout do czegoś innego niż wrap_content.

Jeśli CoordinatorLayout jest wewnątrz innego CoordinatorLayout użyj NestedCoordinatorLayout z tego answer jako wewnątrz CoordinatorLayout.

+0

Próbowałem tego rozwiązania, nie przewijając relacyjnej opcji. Możesz sprawdzić mój układ [tutaj] (http://pastie.org/private/tqzfm4b16q0l08nkypfsxa). Nie użyłem zagnieżdżonego przewijania. – Steve

+1

Nie zawierałeś 'app: layout_scrollFlags =" przewiń "' w twoim 'RelativeLayout'. To bardzo ważne. Dodaj również "app: layout_behavior =" @ string/appbar_scrolling_view_behavior "' do swojego 'RecyclerView'. – razzledazzle

+0

Twoje rozwiązanie działa dla mnie na stronie profilu podobnej do instagramowej bez użycia zagnieżdżonego widoku przewijania. Na tej stronie profilu nie mogę użyć wielu układów w adapterze do recyclerview. To rozwiązanie pomogło mi w krytycznej sytuacji. Zależy mi, aby nagrodzić nagrodę za 500. Dziękuję Ci. – Steve

5

Ważne jest, aby w onBindViewHolder załadować obraz z serwisu internetowego z position-1.
To jest przykład z here i w przypadku Header jest statyczny 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

@ Czy próbowałeś mojego rozwiązania? z twoim wyjaśnieniem Myślę, że to może ci pomóc, ale jeśli masz więcej wymagań, wytłumacz więcej –

+1

sure.now i wypróbuj to i daj znać – Steve

+0

Twoje rozwiązanie działa doskonale. Dziękuję. – Steve

Powiązane problemy