AndroidアプリにおけるPull-To-Refresh(引っ張って更新)ビューを簡単に導入できるAndroid-PullToRefreshというライブラリがあります。Android Support Library, revision 19.1.0 以降のSwipeRefreshLayoutで同様のことが実現できるようなのですが、どうしてもAndroid-PullToRefreshを利用する必要がありました。ちょっと古めのライブラリのせいか、Android Studioから使用する方法が分かりづらかったのでまとめておきます。
なお、このAndroid-PullToRefreshは既にDEPRECATEDになってますので、その点を踏まえて使用するのがよいかとおもいます。
環境
- Android Studio 1.5
導入手順
まずはライブラリをgit cloneします。プロジェクトディレクトリ(git init済み)の直下で、以下のコマンドを叩きます。
📄activity_main.xml
$ mkdir modules $ git submodule add git@github.com:chrisbanes/Android-PullToRefresh.git modules/Android-PullToRefresh
modules以下にAndroid-PullToRefreshがダウンロードされます。
次に、Project Structure
ダイアログを開きます。
ダイアログの+
ボタンをクリックします。
Import Eclipse ADT Project
を選択してNextへ。
次に、さきほどgit submodule化したディレクトリ(プロジェクト/modules/Android-PullToRefresh)直下のlibraryを指定します。Module name
は任意です。
最後のダイアログはデフォルトのままでOKです。
Gradleビルドが自動的に始まりますが、Android-PullToRefreshのビルドに必要なバージョンのBuild Toolがインストールされていない場合は、下図の通りエラーになります。リンクをクリックしてインストールします。
Build Toolをインストールしたら、Gradleビルドは成功するはずです。
続いて、プロジェクトの依存関係を設定します。先ほどのProject Structure
を開き、Modulesのappを選択→Dependenciesタブを選択→+ボタンをクリック→Module dependencyを選択して、先ほど命名したモジュール名を選択します。
サンプル
ちゃんと使えるか、サンプルを作成してみます。以下のようなアクティビティのレイアウトにPullToRefreshListViewを記述します。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="itmammoth.testpulltorefresh.MainActivity"> <com.handmark.pulltorefresh.library.PullToRefreshListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
アクティビティのコードです。
📄MainActivity.java
package itmammoth.testpulltorefresh; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; public class MainActivity extends AppCompatActivity { protected PullToRefreshListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (PullToRefreshListView) findViewById(R.id.listView); listView.setMode(PullToRefreshBase.Mode.BOTH); listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { Log.d("onRefresh", "引っ張られたよ"); new LoadTask().execute(); } }); String[] members = new String[30]; for (int i = 0; i < 30; i++) { members[i] = "item" + (i + 1); } ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, members); listView.setAdapter(adapter); } private class LoadTask extends AsyncTask<Void, Void, String[]> { @Override protected String[] doInBackground(Void... params) { // データ取得処理 return new String[0]; } @Override protected void onPostExecute(String[] strings) { Log.d("onPostExecute", "更新完了"); listView.onRefreshComplete(); super.onPostExecute(strings); } } }
setOnRefreshListenerとsetMode以外は普通のListViewと変わりません。なお、listView.setMode(PullToRefreshBase.Mode.BOTH)
というのは、画面の上下共に引っ張っれるようにするためのオプションです。
これで最低限の設定は完了なので、あとはゴリゴリ書くだけです。
関連する記事
- ViewPager + TabLayout + AdMob コード例
- 【Android】フリックイベントを実装する
- 【Android】リストビューの自動スクロール機能を実装する
- 【Flutter】表示中のアイテムを取得できたり任意のindexにスクロールできたりするListView
- 【Android】10回に1回インタースティシャル広告を表示する