1. ホーム
  2. android

[解決済み] AndroidのPull-to-Refreshの実装方法

2022-03-20 14:25:14

質問

Twitter(公式アプリ)などのAndroidアプリでは、ListViewに出会ったとき、それを下に引っ張って(離すと跳ね返される)内容を更新することができます。

それを実現するためには、どのような方法があるとお考えですか?

いくつか思いつく可能性があります。

  1. ListViewの上にあるアイテム - しかし、ListViewのアニメーションでアイテムの位置1(0ベース)にスクロールバックするのは簡単な作業ではないと思います。
  2. ListViewの外側にある別のビュー - しかし、ListViewが引っ張られたときにListViewの位置を下に移動することに注意する必要があり、ListViewへのドラッグタッチがまだ本当にListView上の項目をスクロールしているかどうかを検出できるかどうかがわかりません。

何かお勧めはありますか?

追伸:Twitter公式アプリのソースコードっていつ公開されるんでしょうね。公開されるとのことですが、半年が過ぎましたが、その後音沙汰がありません。

解決方法は?

ついにGoogleがpull-to-refreshライブラリの正式版をリリースしました!

という名前になっています。 SwipeRefreshLayout サポートライブラリの中にあり、ドキュメントは ここで :

  1. 追加 SwipeRefreshLayout をviewの親にすることで、pullとして扱われ、レイアウトが更新されます。(私は ListView を例にとれば、どのような View のように LinearLayout , ScrollView など)

     <android.support.v4.widget.SwipeRefreshLayout
         android:id="@+id/pullToRefresh"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
         <ListView
             android:id="@+id/listView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>
     </android.support.v4.widget.SwipeRefreshLayout>
    
    
  2. クラスにリスナーを追加する

     protected void onCreate(Bundle savedInstanceState) {
         final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
         pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
                 refreshData(); // your code
                 pullToRefresh.setRefreshing(false);
             }
         });
     }
    
    

を呼び出すこともできます。 pullToRefresh.setRefreshing(true/false); を指定します。

アップデイト

Androidサポートライブラリは非推奨となり、AndroidXに置き換わりました。新しいライブラリへのリンクは以下の通りです。 こちら .

また、プロジェクトに以下の依存関係を追加する必要があります。

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

または

Refactor>>Migrate to AndroidXにアクセスすれば、Android Studioが依存関係を処理してくれます。