で使用android.support.v4.widget.SwipeRefreshLayout
していandroid.support.v7.widget.RecyclerView
ます。
フラグメント ビューの作成時に、SwipeRefreshLayout
アニメーションを表示する必要があります。しかし、私が電話してsetRefreshing(true)
も何も起こりません。しかし、データを更新するとアニメーションが変わります。
child が入っていないとアニメーションが表示されないと思いますSwipeRefreshLayout
。
このアニメーションを最適な方法で表示するにはどうすればよいですか?
5 に答える
これは報告されたバグ (ここで報告) であり、回避策が利用可能です。
mSwipeRefreshLayout.setProgressViewOffset(false, 0,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
24,
getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setRefreshing(true);
ビルドしている API レベルによって異なります。API 20 までを使用している場合は、setRefreshing(true) をオンにするだけで、ActionBar でアニメーションが実行されますが、API 21 (Material Design) では回転する前に「ビューに引き込まれる」よりも、進行状況をスピナーに変更しました
API 21 でこれを回避するには 2 つの方法があります: 1) setProgressViewOffset() でスピナーを下にシフトしますが、後から元に戻すことを忘れないでください (これは px で機能し、setDistanceToTriggerSync() は dp を使用することに注意してください) 2)データを読み込んでいるときに表示される複製スピナー
コード効率の高い解決策は、既存のスピナーを使用することですが、その位置をリセットすることに注意する必要があります
ピクセル密度を計算する必要がある場合は、次から取得できます。
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
float scale = metrics.density;
SwipeRefreshLayout が正しく機能するには、子が含まれている必要があります。どこでも使用する前に、必ず初期化してください。
setRefreshing(true)
の後に呼び出す必要がありますonDraw()
。そうしないと、アニメーションが表示されません。
したがって、Activity では、次のように で実行できますonCreate()
。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// other codes
new Handler().post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
refreshing = true;
refreshData();
}
}
}
フラグメントでは、これらのコードを に入れることができますonActivityCreated()
。