6

23.2'de birlikte çalışmak için geridönüşüm, AppbarLayouts ve SwipeRefreshLayout elde etmenin bir yolu var mı? Ben düşünüyorum oldukça standart bir yöntem kullanıyorum, ancak swiperefreshlayout geri dönüşümcü yukarı taşımaya çalışırken kaydırma jest kapma tutar. ileRecyclerviews ve SwipeRefreshKullanıcı kütüphanesini kullanarak geri yükleme 23.2.0

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

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

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="?attr/toolbar_theme" 
      app:layout_scrollFlags="scroll|enterAlways" 
      android:elevation="4dp" /> 
    </android.support.design.widget.AppBarLayout> 
    <FrameLayout 
     android:id="@+id/fragment_container" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <!--fragment goes here --> 
    </FrameLayout> 
</android.support.design.widget.CoordinatorLayout> 

içinde aşağıdaki bu

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/swipe_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="?attr/window_background"> 
<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ProgressBar 
     android:id="@+id/progress_bar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     style="@style/Widget.AppCompat.ProgressBar.Horizontal" 
     android:layout_marginTop="-4dp" 
     android:layout_marginBottom="-8dp" 
     android:elevation="17dp" 
     android:indeterminate="true" 
     android:visibility="invisible" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" /> 
</FrameLayout> 
</android.support.v4.widget.SwipeRefreshLayout> 

cevap

6

attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="ImprovedSwipeLayoutAttrs"> 
     <attr name="scrollableChildId" format="reference" /> 
    </declare-styleable> 
</resources> 

Layout.xml

<in.nerd_is.inactive_weibo.ui.ImprovedSwipeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:fab="http://schemas.android.com/apk/res-auto" 
    xmlns:isl="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/swipe_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/md_blue_grey_50" 
    isl:scrollableChildId="@+id/list_statuses" 
    tools:context="in.nerd_is.inactive_weibo.ui.StatusesFragment" > 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <ListView 
      android:id="@+id/list_statuses" 
      android:minHeight="?android:attr/listPreferredItemHeight" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingTop="12dp" 
      android:paddingBottom="12dp" 
      android:paddingLeft="8dp" 
      android:paddingRight="8dp" 
      android:clipToPadding="false" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="12dp"/> 

     <com.melnykov.fab.FloatingActionButton 
      android:id="@+id/button_floating_action" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom|right" 
      android:layout_margin="16dp" 
      android:src="@drawable/ic_md_create" 
      fab:fab_colorNormal="@color/md_blue_400" 
      fab:fab_colorPressed="@color/md_blue_grey_500"/> 
    </FrameLayout> 

</in.nerd_is.inactive_weibo.ui.ImprovedSwipeLayout> 

ImprovedSwipeLayout.java

public class ImprovedSwipeLayout extends SwipeRefreshLayout { 

    private static final String TAG = ImprovedSwipeLayout.class.getCanonicalName(); 
    private int mScrollableChildId; 
    private View mScrollableChild; 

    public ImprovedSwipeLayout(Context context) { 
     this(context, null); 
    } 

    public ImprovedSwipeLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     TypedArray a = context.obtainStyledAttributes(
       attrs, R.styleable.ImprovedSwipeLayoutAttrs); 
     mScrollableChildId = a.getResourceId(R.styleable.ImprovedSwipeLayoutAttrs_scrollableChildId, 0); 
     mScrollableChild = findViewById(mScrollableChildId); 
     a.recycle(); 
    } 

    @Override 
    public boolean canChildScrollUp() { 
     ensureScrollableChild(); 

     if (android.os.Build.VERSION.SDK_INT < 14) { 
      if (mScrollableChild instanceof AbsListView) { 
       final AbsListView absListView = (AbsListView) mScrollableChild; 
       return absListView.getChildCount() > 0 
         && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0) 
         .getTop() < absListView.getPaddingTop()); 
      } else { 
       return mScrollableChild.getScrollY() > 0; 
      } 
     } else { 
      return ViewCompat.canScrollVertically(mScrollableChild, -1); 
     } 
    } 

    private void ensureScrollableChild() { 
     if (mScrollableChild == null) { 
      mScrollableChild = findViewById(mScrollableChildId); 
     } 
    } 

} 

Bir Görünüm SwipeRefreshLayout ve özel canChildScrollUp uzatmak oluşturma http://nerd-is.in/2014-09/add-multi-child-view-in-swiperefreshlayout/

geliyor.

2

issue karşı karşıya yüklendikten sonra 23.2.0. Bu, 23.1.1'da düzeltilen ve 23.2.0'da yeniden görüntülenen eski yeni bir hatadır.

Benim durumumda 23.1.1'a geçiyorum ve her seferinde tekrar OK. Bu yüzden, lib'lerin yeni versiyonunu beklemeli veya 'u SwipeRefreshLayout'u geçersiz kılarak kullanmalıyız. Eğer ScrollingView uygulayamaz veya SwipeRefreshLayout içine AbsListView degildir Görünüm koyarsanız RecyclerView v23.2.0 - doesn't play nicely with SwipeRefreshLayout

5

, SwipeRefreshLayout#canChildScrollUp() her zaman false döndürür: Burada


google takipçisi bağlantıdır.

Yani kullanarak bir iki sorunlar var FrameLayoutSwipeRefreshLayout iç:

  1. SwipeRefreshLayout

    soyundan görüşlerin iç içe kaydırma işlemlerini kabul etmez (SwipeRefreshLayout#onStartNestedScroll(View, View, int) bakınız). Bu, CoordinatorLayout/AppBarLayout ile ilgili sorunlara neden olur. Kendi alt yukarı kaydırma olamaz veya devam hiçbir iç içe kaydırma olarak orada

  2. SwipeRefreshLayout (SwipeRefreshLayout#onInterceptTouchEvent(MotionEvent) ve SwipeRefreshLayout#onTouchEvent(MotionEvent) bakınız) sürece dokunmatik olaylarını kendisi yönetir. Bu, "aşağıya doğru hareket ederken" göstericinin görüntülendiği anlamına gelir.

Sen SwipeRefreshLayout#onStartNestedScroll(View, View, int) üzerine yazar kendi SwipeRefreshLayout kullanarak bu sorunu giderebilirsiniz. BTW

public class SwipeRefreshLayout extends android.support.v4.widget.SwipeRefreshLayout { 

    public SwipeRefreshLayout(Context context) { 
     super(context); 
    } 

    public SwipeRefreshLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { 
     return isEnabled() 
       && !isRefreshing() 
       && (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; 
    } 
} 

Eğer göreceksiniz 23.1.1 içinde SwipeRefreshLayout 'ın koduna bakarsak canChildScrollUp() onay olduğunu,: Doğrudan çocuk görünümü yukarı kaydırma olamaz bile bu yolu iç içe kaydırır kabul edilir kaldırıldı ancak 23.2.0'da tekrar eklendi.Ayrıca, mReturningToStart her zaman false olduğundan !mReturningToStart için denetimi kaldırdım.

+0

Artık bu geçici çözümü uygulamanız gerekmez, çünkü bu 23.3.0'da giderilmiştir. – segoh