2014-10-10 25 views
16

canChildScrollUp nasıl uygulanır Merhaba, bir kaydırma görünümü içeren bir göreli düzen içeren bir SwipeRefreshLayout var ve bazen aşağı kaydırmak yerine geri kaydırma yapmazken başka bir görünümü çalışır onRefresh işlevi. Görünüm en üstte değilse, bunu çalıştırmasını nasıl engellerim? Ben canChildScrollUp hakkında okudum ama doğru şekilde uygulamak için bir yol bulamadım. senin kaydırma görünümüdür veya üstünde değilseAndroid SwipeRefreshLocation bir ListView veya ScrollView değilse

heres benim düzen

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

ve heres uygulayan benim sınıf

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

cevap

35

sayesinde Bu işi yapmanın yolu. hile, eğer pozisyon 0 ise, SwipeRefreshLayout öğesinin etkinleştirilmiş olması için ayarlanmışsa, kaydırma görünümünün konumunu tespit etmektir.

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

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

      } 
}); 
+10

Kısa versiyon yukarı olamazsa

//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; 
  • görüşleriniz aracılığıyla

    Yineleyin ve kontrol etmek için yöntem canViewScrollUp() kullanın } ;() { @Override public void() { swipeLayout.setEnabled (scrollView.getScrollY() == 0) onScrollChanged }); ' – spatialist

  • +1

    Yukarıdaki ScrollView'ı bir ListView ile değiştirirsek, çözüm hala ilke olarak çalışır, ancak onScrollChanged() yönteminin içindeki denetim şöyle olmalıdır: listView.getChildAt (0) .getTop() == 0 – macelee

    +0

    güzel cevap! Sorunumu anında çözdüm :) –

    0
    1. SwipeRefreshLayout uzatın ve görüşleriniz yukarı kaydırma yapabilirsiniz belirler yöntemi canChildScrollUp() üzerine yazılır. . `ScrollView.getViewTreeObserver() addOnScrollChangedListener (yeni OnScrollChangedListener: bunlardan herhangi

      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; 
          } 
      } 
      
    İlgili konular