Android StudioからAndroid-PullToRefreshを使用する


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ダイアログを開きます。

スクリーンショット 2015-11-21 19.45.12

ダイアログのボタンをクリックします。

スクリーンショット 2015-11-21 19.48.27

Import Eclipse ADT Projectを選択してNextへ。

スクリーンショット 2015-11-21 19.50.05

次に、さきほどgit submodule化したディレクトリ(プロジェクト/modules/Android-PullToRefresh)直下のlibraryを指定します。Module nameは任意です。

スクリーンショット 2015-11-21 20.00.01

最後のダイアログはデフォルトのままでOKです。

スクリーンショット 2015-11-21 19.55.16

Gradleビルドが自動的に始まりますが、Android-PullToRefreshのビルドに必要なバージョンのBuild Toolがインストールされていない場合は、下図の通りエラーになります。リンクをクリックしてインストールします。

スクリーンショット 2015-11-21 20.02.28

Build Toolをインストールしたら、Gradleビルドは成功するはずです。

続いて、プロジェクトの依存関係を設定します。先ほどのProject Structureを開き、Modulesのappを選択→Dependenciesタブを選択→+ボタンをクリック→Module dependencyを選択して、先ほど命名したモジュール名を選択します。

スクリーンショット 2015-11-21 20.08.03

サンプル

ちゃんと使えるか、サンプルを作成してみます。以下のようなアクティビティのレイアウトに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)というのは、画面の上下共に引っ張っれるようにするためのオプションです。

これで最低限の設定は完了なので、あとはゴリゴリ書くだけです。

 

関連する記事


コメントする

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください