2014-10-10 14 views
16

Ciao ho un SwipeRefreshLayout che contiene un layout relativo che contiene una vista di scorrimento e un'altra vista attualmente quando scorrono verso il basso l'elenco a volte non lo scorrimento di nuovo invece viene eseguito la funzione onRefresh. Come faccio a impedirgli di farlo, a meno che la vista non sia in cima? avevo letto su canChildScrollUp ma non ho trovato un modo per implementarlo correttamente.Android SwipeRefreshLayout come implementare canChildScrollUp se child non è un ListView o ScrollView

heres il mio layout

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

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

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     > 

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbars="none"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 



     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/profile" 
      android:background="@drawable/homepage_image_1">   

      <com.alldaypa.alldaypa.customviews.CircularImageView 

       android:layout_width="75dp" 
       android:layout_height="75dp" 
       app:border_color="#FFFFFF" 
       app:border_width="8dp" 
       app:shadow="false" 
       android:id="@+id/profile_image" 
       android:layout_alignParentTop="true" 
       android:layout_alignParentLeft="true" 
       android:layout_marginLeft="70dp" 
       android:layout_marginTop="20dp" 
       android:src="@drawable/homepage_noimage_male" 
       android:clickable="true" /> 

      <ImageView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignBottom="@+id/profile_image" 
       android:layout_alignRight="@+id/profile_image" 
       android:src="@drawable/homepage_profile_add" 
       android:layout_marginRight="3dp" 
       android:layout_marginBottom="3dp" 
      /> 




      <TextView android:id="@+id/profile_name" 
       android:text="Name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textSize="20sp" 
       android:layout_alignTop="@+id/profile_image" 
       android:layout_toRightOf="@+id/profile_image" 
       android:layout_marginTop="20dp" 
       android:textColor="@color/darkgrey" 
       android:layout_marginLeft="10dp"/> 

      <TextView android:id="@+id/company" 
       android:text="Company" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textSize="16sp" 
       android:layout_below="@+id/profile_name" 
       android:layout_alignLeft="@+id/profile_name" 
       android:textColor="@color/darkgrey" 
       android:layout_marginTop="-2dp"/> 


     </RelativeLayout> 

      <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/availability" 
      android:background="@color/white" 
      android:padding="20dp" 
      android:layout_below="@+id/profile">   


      <TextView android:id="@+id/profile_status_title" 
      android:text="Your current availability status:" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="14sp" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:textColor="@color/darkgrey"/> 

      <TextView android:id="@+id/profile_status" 
      android:text="Available" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="32sp" 
      android:layout_below="@+id/profile_status_title" 
      android:layout_centerHorizontal="true" 
      android:textColor="@color/green" 
      android:layout_marginTop="-2dp"/> 

      <TextView android:id="@+id/profile_status_reason" 
      android:text="On: 01924 501370" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="24sp" 
      android:layout_below="@+id/profile_status" 
      android:layout_centerHorizontal="true" 
      android:textColor="@color/pink"/> 

     </RelativeLayout> 


     <TextView 
     android:id="@+id/messages" 
     android:layout_width="match_parent" 
     android:layout_height="30dp" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/availability" 
     android:ellipsize="end" 
     android:lines="1" 
     android:background="@color/pink" 
     android:textColor="@color/white" 
     android:textSize="14sp" 
     android:paddingLeft="10dp" 
     android:paddingTop="5dp" 
     android:gravity="left" 
     android:text="Messages" /> 

     <RelativeLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_below="@+id/messages" 
      android:background="@color/midgrey"> 

      <com.alldaypa.alldaypa.customviews.SwipeListView 
       xmlns:swipe="http://schemas.android.com/apk/res-auto" 
       android:id="@+id/list" 
       android:listSelector="#00000000" 
       android:layout_width="fill_parent" 
       android:layout_height="400dp" 
       swipe:swipeFrontView="@+id/front" 
       swipe:swipeBackView="@+id/back" 
       swipe:swipeActionLeft="reveal" 
       swipe:swipeMode="left" 
       swipe:swipeCloseAllItemsWhenMoveList="true" 
       swipe:swipeOpenOnLongPress="false" 
       swipe:swipeAnimationTime="0" 
       swipe:swipeOffsetLeft="200dp" 
       swipe:swipeOffsetRight="0dp" 
       android:focusable="false" 
      /> 


       <ImageView android:layout_height="1dp" 
       android:layout_width="match_parent" 
       android:background="@color/searchbg" 
       android:layout_below="@+id/list" 
       android:layout_alignLeft="@+id/list" 
       android:id="@+id/line" 


       /> 

      <Button 
       android:layout_width="match_parent" 
       android:layout_height="60dp" 
       android:background="@drawable/listitem" 
       android:textColor="@color/darkgrey" 
       android:textSize="18sp" 
       android:text="View all messages" 
       android:layout_below="@+id/line" 
       android:gravity="center" 
       android:layout_centerVertical="true" 
       android:id="@+id/viewall" 
       android:layout_centerHorizontal="true" 
       /> 

     </RelativeLayout> 
</RelativeLayout> 



</ScrollView> 

<include layout="@layout/elv_undo_popup" android:id="@+id/undo" android:visibility="gone"/> 
</RelativeLayout> 

</android.support.v4.widget.SwipeRefreshLayout> 

e heres dove ho implementato la mia classe

swipeLayout = (SwipeRefreshLayout)v.findViewById(R.id.swipe_container); 
     swipeLayout.setColorSchemeColors(Color.parseColor("#ed037c"), Color.parseColor("#c40053"),Color.parseColor("#ffffff"), Color.parseColor("#51af50")); 

     swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override public void onRefresh() { 
       swipeLayout.setRefreshing(true); 
       Log.d("Swipe", "Refreshing Number"); 
       (new Handler()).postDelayed(new Runnable() { 
        @Override public void run() { 

         updateLocalData(); 

        } 
        }, 3000); 
       } 
      }); 

risposta

35

grazie alla @Twibit ho trovato un modo per far funzionare questo il trucco è quello di rilevare la posizione della scrollview se la posizione è 0, per fare in modo che lo SwipeRefreshLayout sia abilitato altrimenti disabilitato.

scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() { 

      @Override 
      public void onScrollChanged() { 
       int scrollY = scrollView.getScrollY(); 
       if(scrollY == 0) swipeLayout.setEnabled(true); 
       else swipeLayout.setEnabled(false); 

      } 
}); 
+10

Versione corta:. 'ScrollView.getViewTreeObserver() addOnScrollChangedListener (nuova OnScrollChangedListener() { @Override public void onScrollChanged() { swipeLayout.setEnabled (scrollView.getScrollY() == 0);} }); ' – spatialist

+1

Se sostituiamo ScrollView sopra con ListView, la soluzione funziona ancora in linea di principio, ma il controllo all'interno del metodo onScrollChanged() dovrebbe essere qualcosa come: listView.getChildAt (0) .getTop() == 0 – macelee

+0

bella risposta! risolto il mio problema al volo :) –

2

Potrebbe essere necessario abilitare/disabilitare il layout colpo se la vista di scorrimento è o non è in cima .

Si può guardare a questo link per l'ispirazione: https://gist.github.com/Frikish/10025057

Un altro esempio che potrebbe aiutare: https://developer.android.com/samples/SwipeRefreshMultipleViews/src/com.example.android.swiperefreshmultipleviews/MultiSwipeRefreshLayout.html

ho avuto un altro problema con scorrimento orizzontale: HorizontalScrollView inside SwipeRefreshLayout

0
  1. Estendere SwipeRefreshLayout e sovrascrivere il metodo canChildScrollUp() che determina se le vostre opinioni possono scorrere verso l'alto.

    //if you have several scrollable views,just iterate 
    for (View view : ...) { 
        if (view != null && view.isShown() && !canViewScrollUp(view)) { 
         // If the view is shown, and can not scroll upwards, return false and start the 
         // gesture. 
         return false; 
        } 
    return true; 
    
  2. Scorrere le vostre opinioni e utilizzare il metodo canViewScrollUp() per verificare se qualcuno di loro non si può scorrere verso l'alto

    private static boolean canViewScrollUp(View view) { 
        if (android.os.Build.VERSION.SDK_INT >= 14) { 
         // For ICS and above we can call canScrollVertically() to determine this 
         return ViewCompat.canScrollVertically(view, -1); 
        } else { 
         if (view instanceof AbsListView) { 
         // Pre-ICS we need to manually check the first visible item and the child view's top 
         // value 
         final AbsListView listView = (AbsListView) view; 
         return listView.getChildCount() > 0 && 
          (listView.getFirstVisiblePosition() > 0 
            || listView.getChildAt(0).getTop() < listView.getPaddingTop()); 
        } else { 
         // For all other view types we just check the getScrollY() value 
         return view.getScrollY() > 0; 
        } 
    } 
    
Problemi correlati