web-dev-qa-db-ja.com

SwipeRefreshLayoutでスワイプダウン距離を調整する方法

アプリにSwipeRefreshLayoutを実装しました。 onRefresh()メソッドを呼び出すためにスクロールダウンする必要がある高さを変更する必要があります。カスタムの高さを追加するにはどの方法を使用すればよいですか?

SwipeRefreshLayoutの実装

private SwipeRefreshLayout swipeLayout;

Oncreate

swipeLayout   = (SwipeRefreshLayout)view.findViewById(R.id.swipe_container);
swipeLayout.setOnRefreshListener(this);
        swipeLayout.setColorScheme(Android.R.color.holo_blue_dark, 
                Android.R.color.holo_green_dark, 
                Android.R.color.holo_purple, 
                Android.R.color.holo_orange_dark);   
        swipeLayout.setSoundEffectsEnabled(true);

OnrefreshメソッドでのAsyncTaskの実装

   @Override
public void onRefresh() 
{
    // Asynctask to perform some task  

}
25
Anirudh

サポートライブラリのAPI 21を使用している場合は、Han Heの回答 here を参照して投票してください。 setDistanceToTriggerSyncと呼ばれるトリガー距離を設定するメソッドが存在します。


API 21以前は、付随的に言及したように、トリガー距離を変更するためのパブリックメソッドまたは内部メソッドはありません。

ただし、クラスのコピーを保持して定数を変更したくない場合は、reflectionを使用してトリガー距離を手動で設定できます。

swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);

// define a distance
Float mDistanceToTriggerSync = yourCalculation(); 

try {
    // Set the internal trigger distance using reflection.
    Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync");
    field.setAccessible(true);
    field.setFloat(swipeLayout, mDistanceToTriggerSync);
} catch (Exception e) {
    e.printStackTrace();
}

レイアウトの高さを使用して距離を決定している場合は、GlobalLayoutListenerのようなものを使用できます。

mDistanceToTriggerSync

SwipeRefreshLayoutには、mDistanceToTriggerSyncという内部変数があります。これは、リフレッシュをトリガーする距離を決定するために使用されます。

ソースコードでは、以下のコードでSwipeRefreshLayoutに設定されています。

final DisplayMetrics metrics = getResources().getDisplayMetrics();
mDistanceToTriggerSync = (int) Math.min(
        ((View) getParent()) .getHeight() * MAX_SWIPE_DISTANCE_FACTOR,
                REFRESH_TRIGGER_DISTANCE * metrics.density);

上記では、親ビューの高さといくつかの定数を使用してトリガー距離を計算しています。 MAX_SWIPE_DISTANCE_FACTOR(0.6)およびREFRESH_TRIGGER_DISTANCE(120)は、変更できないクラスのプライベート定数です。

上記を使用してトリガー距離を計算し、スワイプ距離係数に独自の定数を使用できます。

GlobalLayoutListener

mDistanceToTriggerSyncの設定はグローバルレイアウトリスナー内で実行できるため、トリガーの距離を計算するためにレイアウトの高さを適切に取得できます。 getHeightのビューでonCreateを呼び出すと、まだ描画されていないため、常に0を返します。 here からコードを取得しました。要件に応じて、これを行う必要がある場合とそうでない場合があります。

ViewTreeObserver vto = swipeLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Calculate the trigger distance.
        final DisplayMetrics metrics = getResources().getDisplayMetrics();
        Float mDistanceToTriggerSync = Math.min(
                ((View) swipeLayout.getParent()).getHeight() * 0.6f,
                120 * metrics.density);

        try {
            // Set the internal trigger distance using reflection.
            Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync");
            field.setAccessible(true);
            field.setFloat(swipeLayout, mDistanceToTriggerSync);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Only needs to be done once so remove listener.
        ViewTreeObserver obs = swipeLayout.getViewTreeObserver();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            obs.removeOnGlobalLayoutListener(this);
        } else {
            obs.removeGlobalOnLayoutListener(this);
        }
    }
});

mDistanceToTriggerSync-1と等しい場合にのみ設定するため、基になるコードを適切に理解している場合、変数の設定は一度だけ行う必要があります。したがって、グローバルレイアウトリスナーで一度実行すれば安全です。

SwipeRefreshLayout

SwipeRefreshLayoutのソースコードに興味がある場合は、それを見つけることができます here

28
singularhum

V4サポートライブラリのバージョン21には、距離を設定するためのAPIが用意されています。

public void setDistanceToTriggerSync (int distance)

文書 ここ を確認してください。

もう1つ、回転。 21はプログレスバーの動作を変更しました、今は円形の画像です。古い方法を取り戻す方法がわかりません。

33
Han He

現在のところ、トリガー距離を調整するために使用できるパブリックメソッドはなく、内部メソッドもありません。しかし、3つのクラスをサポートライブラリからプロジェクトにコピーしてから、SwipeRefreshLayoutを好みに応じて変更できます。

コピーする必要があるクラスは次のとおりです。

ティガー距離は、定数を使用して計算されます。

 private static final float MAX_SWIPE_DISTANCE_FACTOR = .6f;
 private static final int REFRESH_TRIGGER_DISTANCE = 120;

レイアウトの変更<Android.support.v4.widget.SwipeRefreshLayout.../><your_path_to_SwipeRefreshLayout.../>必要に応じて、インポートを変更してください。

3
adneal