ActionBar-PullToRefresh
※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+っぽい感じ)