アプリに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
}
サポートライブラリの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 。
V4サポートライブラリのバージョン21には、距離を設定するためのAPIが用意されています。
public void setDistanceToTriggerSync (int distance)
文書 ここ を確認してください。
もう1つ、回転。 21はプログレスバーの動作を変更しました、今は円形の画像です。古い方法を取り戻す方法がわかりません。
現在のところ、トリガー距離を調整するために使用できるパブリックメソッドはなく、内部メソッドもありません。しかし、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.../>
必要に応じて、インポートを変更してください。