18

私はSwipeRefreshLayout以下のレイアウトで使用しています:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@color/homePageBackground"
  android:orientation="vertical" >


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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
<fragment
        android:id="@+id/announcementHomefragment"
        android:name="in.test.app.AnnouncementFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/homePageBackground" >

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="15dp"
                android:background="@color/homePageBackground" >

                <TextView
                    android:id="@+id/newsTitle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="15dp"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="@string/new_list"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:textColor="@color/white"
                    android:textStyle="bold" />

                <fragment
                    android:id="@+id/newshomefragment"
                    android:name="in.test.app.NewsFragment"
                    android:layout_width="wrap_content"
                    android:layout_height="190dp"
                    android:layout_below="@id/newsTitle"
                    android:layout_marginTop="-15dp" />

                <TextView
                    android:id="@+id/productTitle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/newshomefragment"
                    android:layout_gravity="center"
                    android:layout_marginLeft="15dp"
                    android:layout_marginTop="5dp"
                    android:gravity="center"
                    android:text="@string/product_in_home"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:textColor="@color/white"
                    android:textStyle="bold" />

                <fragment
                    android:id="@+id/proCategoryhomefragment"
                    android:name="in.test.app.CategoryFragment"
                    android:layout_width="wrap_content"
                    android:layout_height="170dp"
                    android:layout_below="@id/productTitle"
                    android:layout_marginTop="-15dp" />

                <TextView
                    android:id="@+id/trainingTitle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/proCategoryhomefragment"
                    android:layout_gravity="center"
                    android:layout_marginLeft="15dp"
                    android:layout_marginTop="2dp"
                    android:gravity="center"
                    android:text="@string/trainings_in_home"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:textColor="@color/white"
                    android:textStyle="bold" />

                <fragment
                    android:id="@+id/trainingfragment"
                    android:name="in.test.app.TrainingFragment"
                    android:layout_width="match_parent"
                    android:layout_height="180dp"
                    android:layout_below="@id/trainingTitle"
                    android:layout_marginBottom="10dp"
                    android:layout_marginTop="-15dp" />
            </RelativeLayout>
        </ScrollView>
    </LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>

プルダウンするSwipeRefreshLayoutと機能しますが、上記のコードでわかるように、その中にスクロールビューがあります。そのため、スクロール ビューをプルダウンすると、スクロール ビューがダウンし、ダウンしたために画像の半分が表示されません。もう一度引き上げようとすると、スクロール ビューが上がりません。代わりに、SwipeRefreshLayout電話を受けています。私は何をすべきか?

私を助けてください。

4

7 に答える 7

6

メソッドを拡張 SwipeRefreshLayoutしてオーバーライドするクラスを作成するだけcanChildScrollUp()です。コントロールを下にスクロールする場合は true を返します。

たとえば、スクロールビューの場合、これを試すことができます。

@override.
boolean canChildScrollUp()
{
   //your condition to check scrollview reached at top while scrolling
   if(scrollview.getScrollY() == 0.0)
      return true;
   else
      return false;
}
于 2014-04-23T06:50:44.187 に答える
5

他の人がすでに述べているように、スクロール可能なビュー (つまり、リストビュー) を SwipeRefreshLayout の直接の子として持っていない場合、在庫の canChildScrollUp は機能しません。

子ビューのスクロール機能をチェックする際に SwipeRefreshLayout が使用する単純なロジックに関係しています。

私は ActionbarActivity 内で ListView を使用していましたが、リストビューが空のときはいつでも空のビューを含めたいと考えていました。SwipeRefreshLayout クラスは子を 1 つしか持つことができないため、これが問題を引き起こしました。また、この子の scrollUp 機能をチェックして、プルダウンによって子が scrollUp されるかどうか、または子のコンテンツが更新されるかどうかを判断することに注意してください。

したがって、SwipeRefreshLayout と同じロジックを使用する場合は、クラスを拡張して、ハンドルをスクロール可能なビューに渡すことができるメソッドを作成するだけです。ストックの実装では canScrollVertically() を使用していることに注意してください。

また、クラスを拡張するときは、パラメーター「AttributeSet」を含むコンストラクターを含めることを忘れないでください。そうしないと、レイアウト ファイルでクラスを使用する際に問題が発生します。

したがって、リスト ビューを含むアクティビティ (私の場合は ActionBarActivity でした) の onCreate メソッドで、setMyScrollableView を呼び出して、ListView またはスクロールに使用するビューを渡すだけです。

/*Constructor*/
public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}


 View mMyScrollableView = null;  //The content that get's pulled down.
 /*Method used to pass in my scrollable view*/
 public void setMyScrollableView(View view){
    mMyScrollableView = view;
 }

/**
 * @return Whether it is possible for the child view of this layout to
 * scroll up.  This was taken for the most part directly from SwipeRefreshLayout
 */
public boolean canChildScrollUp() {
    if(mMyScrollableView == null)
      return false;
    if (android.os.Build.VERSION.SDK_INT < 14) {
        if (mMyScrollableView instanceof AbsListView) {
            final AbsListView absListView = (AbsListView) mMyScrollableView;
            return absListView.getChildCount() > 0
        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
        .getTop() < absListView.getPaddingTop());
        } else {
            return mMyScrollableView.getScrollY() > 0;
        }
    } else {
        return ViewCompat.canScrollVertically(mMyScrollableView, -1);
    }
}
于 2014-07-29T20:42:03.703 に答える
2

より簡単な解決策は、使用onScrollListenerして、ユーザーが firstElement を表示できるかどうかを確認することです。

someView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView absListView, int scrollState) {
        if (scrollState == SCROLL_STATE_IDLE) {
            if (isViewAtTop()) {
                swipeLayout.setEnabled(true);
            } else {
                swipeLayout.setEnabled(false);
            }
        }

    }

    @Override
    public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (firstVisibleItem == 0) {
            swipeLayout.setEnabled(true);
        } else {
            swipeLayout.setEnabled(false);
        }
    }
});

メソッド isViewAtTop() は、このビューが一番上までスクロールされていることを確認する他のメソッドです。

于 2014-07-25T09:30:07.467 に答える
1

わかりました。動作しています。がSwipeRefreshLayoutレイアウトのルートであり、ScrollViewが階層の奥深くに存在し (ScrollView内部に a を配置したRelativeLayout)、 の直接の子でSwipeRefreshLayoutはない場合、上へのスワイプがScrollView適切に検出されません。

メソッドを拡張SwipeRefreshLayoutしてオーバーライドするカスタム クラスを作成する必要があります。canChildScrollUp()SwipRefreshLayout

例を次に示します。

 public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {

    private ScrollView scrollview;

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

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

    public void setView(ScrollView view) {
        this.scrollview = view;
    }

    @Override
    public boolean canChildScrollUp() {
        return scrollview.getScrollY() != 0;
    }

}
于 2014-05-15T13:17:17.780 に答える