ActionBar-PullToRefresh

2014-02-12T00:00:00+00:00 Android Java

※ActionBar-PullToRefreshも「PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED」になってますので現時点で使う場合注意

Android PullToRefreshにも追記しましたが、Android-PullToRefresh は既にdeprecated(正確にはNO LONGER BEING MAINTAINED)らしいので、ActionBar-PullToRefreshを使えとのこと。つーことでListFragmentを使う場合のドキュメントを見つつやってみた

※但し、Android PullToRefreshとActionBar PullToRefreshはスタンスは異なるかと思われますので

環境のセットアップ

githubからダウンロードしてくるなりで良いかと思いきや、https://github.com/castorflex/SmoothProgressBar っていうのに依存しているらしい。で問題はこれがgradle-android-pluginなプロジェクトでEclipseにインポート出来ないんだろうかってところで躓いたので、Android Studioでビルドする方向でやる

で特にダウンロードはしてこなくて良い。build.gradleとかでグダグダ書けば良いだけなので

プロジェクト構造

├─ app
│   ├── build.gradle
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── java
│           │   └── sample
│           │       └── test
│           │           ├── MainActivity.java
│           │           └── SampleListFragment.java
│           └── res
│               ├── drawable-hdpi
│               ├── drawable-ldpi
│               ├── drawable-mdpi
│               ├── drawable-xhdpi
│               ├── layout
│               │   └── activity_main.xml (ただ書いてるだけなので省略)
│               └── values
│                   └── strings.xml
├── build.gradle
└── settings.gradle

まぁappしかないのでsettings.gradle自体はincludeするだけなので省略する

build.gradle

※app内のbuild.gradleでは無い

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:0.8+"
    }
}

特になんかいう必要性も無いんで(ry

app/build.gradle

apply plugin: "android"

repositories {
    mavenCentral()
}

dependencies {
    compile "com.github.chrisbanes.actionbarpulltorefresh:extra-abs:+"
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"
}

ActionBar-PullToRefreshなcompileスコープでの参照を追加するくらい

MainActivity.java

package sample.test;

import android.os.Bundle;

import com.actionbarsherlock.app.SherlockFragmentActivity;

public class MainActivity extends SherlockFragmentActivity {
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
    }
}

activity_mainでは以下で書くListFragmentなのを指定しているだけなので(ry

SampleListFragment.java

package sample.test;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

import uk.co.senab.actionbarpulltorefresh.extras.actionbarsherlock.PullToRefreshLayout;
import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh;
import uk.co.senab.actionbarpulltorefresh.library.listeners.OnRefreshListener;

public class SampleListFragment extends ListFragment
    implements OnRefreshListener {

    private static final String TAG = SampleListFragment.class.getName();

    private final Handler mHandler = new Handler();
    private ArrayAdapter<String> mAdapter;
    private PullToRefreshLayout mPullToRefreshLayout;

    @Override
    public void onActivityCreated(Bundle bundle) {
        super.onActivityCreated(bundle);
        Log.v(TAG, "onActivityCreated");

        mAdapter = new ArrayAdapter<String>(
            getActivity(),
            android.R.layout.simple_list_item_1
        );
        setListAdapter(mAdapter);

        for (int i = 0; i < 10; i++)
            mAdapter.add("hoge" + (i + 1));
    }

    @Override
    public void onViewCreated(View view, Bundle bundle) {
        super.onViewCreated(view, bundle);
        Log.v(TAG, "onViewCreated");
        mPullToRefreshLayout = new PullToRefreshLayout(view.getContext());

        ActionBarPullToRefresh.from(getActivity())
            .insertLayoutInto((ViewGroup)view)
            .theseChildrenArePullable(getListView(), getListView().getEmptyView())
            .listener(this)
            .setup(mPullToRefreshLayout);
    }

    @Override
    public void onRefreshStarted(View view) {
        Log.v(TAG, "onRefreshStarted");
        mHandler.postDelayed(
            new Thread() {
                @Override
                public void run() {
                    mPullToRefreshLayout.setRefreshComplete();
                }
            },
            5000
        );
    }
}

ってな感じですね。上から下にスライドする形を行うとonRefreshStartedなメソッドが処理されるのでそれでリロードなりな処理をすれば良い模様。恐らくは今回はActionBarSherlockを使ってますが、そうでは無い場合にはPullToRefreshLayoutクラスのパッケージは異なるのかも知れない(未検証)

てな感じでやったのをキャプチャ動画用意しました

{% youtube dPUQnswmAEg %}

以上。何やらAndroid-PullToRefreshとは違って、あくまでActionBarによりインディケーター作用によるUIな方式に変わったようで(Google+っぽい感じ)

余談

ActionBar-PullToRefreshをメニューボタン等で連動させる

gradle-android-toolkitのallprojects gradle-android-toolkitでライブラリプロジェクト