2015-01-11 4 views
2

У меня есть ViewPager для основного макета, с 3 фрагментами в виде страниц, 2 из них имеют GrideView внутри них.SwipeRefreshLayout вмешивается в GridView внутри ViewPager

основной код страницы:

<android.support.v4.widget.SwipeRefreshLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/mainRefreshLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v4.view.ViewPager 
     android:id="@+id/main_pager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     </android.support.v4.view.ViewPager> 
</android.support.v4.widget.SwipeRefreshLayout> 

код первого фрагмента:

<GridView 
    android:id="@+id/firstCategoryGridView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:numColumns="1" 
    android:stretchMode="columnWidth" 
    android:scrollbars="none" 
    android:listSelector="#00000000"> 
</GridView> 

вид сетки заполнен предметами. в середине списка, когда я прокручиваю вверх, SwipeRefreshLayout активируется, прежде чем список достигнет вершины. как я могу это решить?

ответ

3

Я ненавижу отвечать на свой вопрос, но я всегда делаю :).

поэтому на примере google SwipeRefreshMultipleViews с небольшим изменением в классе MultiSwipeRefreshLayout мне удалось решить эту проблему.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/black"> 

    <android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/main_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="@color/dark_blue" 
     app:theme="@style/Theme.AppCompat" 
     android:layout_alignParentTop="true"/> 

    <com.mehdok.slidingtabs.SlidingTabLayout 
     android:id="@+id/main_sliding_tabs" 
     android:background="@color/blue" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/main_toolbar" /> 

    <fr.castorflex.android.smoothprogressbar.SmoothProgressBar 
     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="4dp" 
     android:indeterminate="true" 
      app:spb_sections_count="4" 
     app:spb_color="@color/white" 
      app:spb_speed="0.5" 
     app:spb_stroke_width="4dp" 
      app:spb_stroke_separator_length="4dp" 
     app:spb_reversed="false" 
      app:spb_mirror_mode="false" 
     app:spb_progressiveStart_activated="false" 
      app:spb_progressiveStart_speed="1.5" 
     app:spb_progressiveStop_speed="3.4" 
     android:layout_below="@id/main_toolbar" 
     android:visibility="gone" 
     android:id="@+id/downloadBar"/> 

    <com.mehdok.views.MultiSwipeRefreshLayout 
     android:id="@+id/swiperefresh" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/main_sliding_tabs"> 

    <android.support.v4.view.ViewPager 
       android:id="@+id/main_pager" 
       android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 
     </android.support.v4.view.ViewPager> 
     </com.mehdok.views.MultiSwipeRefreshLayout> 

</RelativeLayout> 

Java-часть

public class MultiSwipeRefreshLayout extends SwipeRefreshLayout { 

    private GridView[] mSwipeableChildren; 
    private int visibleView = 0; 

    public MultiSwipeRefreshLayout(Context context) { 
     super(context); 
     mSwipeableChildren = new GridView[3]; 
    } 

    public MultiSwipeRefreshLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mSwipeableChildren = new GridView[3]; 
    } 


    public void addGridView(GridView v, int i) 
    { 
     mSwipeableChildren[i] = v; 
    } 


    /** 
    * This method controls when the swipe-to-refresh gesture is triggered. By returning false here 
    * we are signifying that the view is in a state where a refresh gesture can start. 
    * 
    * <p>As {@link android.support.v4.widget.SwipeRefreshLayout} only supports one direct child by 
    * default, we need to manually iterate through our swipeable children to see if any are in a 
    * state to trigger the gesture. If so we return false to start the gesture. 
    */ 
    @Override 
    public boolean canChildScrollUp() { 
     if (mSwipeableChildren != null && mSwipeableChildren.length > 0) { 
       for(int i = 0; i < 3; i++) 
       { 
         if((i == visibleView) && mSwipeableChildren[i] != null && !canViewScrollUp(mSwipeableChildren[i])) 
         { 
           return false; 
         } 
       }    
     } 

     return true; 
    } 



    /** 
    * Utility method to check whether a {@link View} can scroll up from it's current position. 
    * Handles platform version differences, providing backwards compatible functionality where 
    * needed. 
    */ 
    private static boolean canViewScrollUp(GridView view) 
    { 
     return view.getChildCount() > 0 && 
       (view.getFirstVisiblePosition() > 0 
         || view.getChildAt(0).getTop() < view.getPaddingTop()); 
    } 

    public void setVisibleView(int i) 
    { 
     visibleView = i; 
    } 

} 
+0

Можете ли вы сказать, как вы разрешили эту проблему с этим классом MultiSwipeRefreshLayout, я застрял в этой проблеме, не смог ее решить. – Lakshmanan

+0

@ Lakshmanan это было год назад, и на самом деле я не помню, что я сделал, но я добавил свой код к ответу. может быть, вы можете извлечь что-то из этого. – mehdok

+0

Спасибо за ваш ответ. Более того, я попробовал ваш код. Но теперь SwipeRefreshLayout не запускает даже представление Grid, которое было достигнуто, позвольте мне попробовать что-то еще, Пожалуйста, дайте мне знать, если у вас есть идеи. – Lakshmanan

1

Продлить SwipeRefreshLayout используя новый класс и переопределить его canChildScrollUp(). return true, если вы хотите прокрутить вниз для gridview. ex

@override. 
boolean canChildScrollUp() 
{ 
return gridview.getFirstVisibleItemPostion()!=0; 
} 
Смежные вопросы