Instagram API解析クラスの追加
ここからコードの追加です。まずは、Instagram API解析クラス(ParseInstagramImage)を作成します。
public class ImageInfo {
private String standard; // 標準解像度の画像URL
private String thumbnail; // サムネイル画像のURL
public String getThumbnail(){ return this.thumbnail; }
public String getStandard(){ return this.standard; }
public void setStandard(String standard){ this.standard = standard; }
public void setThumbnail(String thumbnail){ this.thumbnail = thumbnail; }
}
public class ParseInstagramImage extends ParseJson {
// 画像情報のリスト
private List<ImageInfo> image_info = new LinkedList<ImageInfo>();
// 次の画像を取得するためのURL
private String next_url = null;
public List<ImageInfo> getImageinfo() { return this.image_info; }
public String getNext_url() { return this.next_url; }
public ParseInstagramImage(String next_url) {
super();
this.next_url = next_url;
}
// 保持しているリストのクリア
public void clear() { this.image_info.clear(); }
// レスポンスの解析
@Override
public void loadJson(String str) {
JsonNode root = getJsonNode(str);
if (root != null){
// 次のURLを取得(1)
this.next_url = root.path("pagination").path("next_url").asText();
Iterator<JsonNode> ite = root.path("data").elements();
while (ite.hasNext()) {
JsonNode j = ite.next();
ImageInfo img = new ImageInfo();
img.setThumbnail(j.path("images").path("thumbnail")
.path("url").asText());
img.setStandard(j.path("images").path("standard_resolution")
.path("url").asText());
// 画像情報(URL)をリストに追加(2)
image_info.add(img);
}
}
}
}
ImageInfoは、画像情報を格納するデータクラスです。
レスポンスデータの解析は、ParseInstagramImageクラスのloadJsonメソッドで行います。引数で渡されたJSON形式の文字列から、次ページのURL(1)と、2種類の画像データのURLを取得(2)しています。
グリッドビューの表示
では次に、Fragmentクラスにコードを追加していきましょう。なお、今回のサンプルでは、Fragmentクラスの名称をPlaceholderFragmentからInstagramFragmentに変更しています。
public static class InstagramFragment
extends Fragment implements LoaderCallbacks<String>, OnRefreshListener {
private SwipeRefreshLayout swipeRefreshLayout = null;
// Instagram API解析クラス
private ParseInstagramImage parse =
new ParseInstagramImage(
"https://api.instagram.com/v1/tags/akb48/media/recent?client_id=XX");
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,Bundle savedInstanceState) {
View rootView =
inflater.inflate(R.layout.fragment_main, container,false);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
this.swipeRefreshLayout = (SwipeRefreshLayout)getView().
findViewById(R.id.SwipeRefreshLayout);
// プログレスアニメーションの色指定(1)
this.swipeRefreshLayout.
setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
// 更新リスナーの追加(2)
this.swipeRefreshLayout.
setOnRefreshListener(InstagramFragment.this);
// アニメーション開始(3)
this.swipeRefreshLayout.setRefreshing(true);
onRefresh(); // 更新処理
}
// loaderの開始
private void startLoader(int id) {
getLoaderManager().restartLoader(id, null, InstagramFragment.this);
}
// 取得データの更新(次の20枚の取得)(4)
@Override
public void onRefresh() {
this.parse.clear();
startLoader(0);
}
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
HttpAsyncLoader loader = new HttpAsyncLoader(getActivity(),
parse.getNext_url());
loader.forceLoad();
return loader;
}
@Override
public void onLoadFinished(Loader<String> loader, String data) {
if (data == null) return;
this.parse.loadJson(data); // APIのレスポンスを解析する
// 文字列のアダプターを作成する
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1);
// URLの取り出し
for (ImageInfo info : this.parse.getImageinfo() ){
adapter.add(info.getThumbnail()); }
// アダプターの設定
((GridView)getView().findViewById(R.id.gridView)).
setAdapter(adapter);
// アニメーション停止(5)
this.swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onLoaderReset(Loader<String> loader) {}
}
これまでのローダーを使った処理と、大きく変わったところはありませんが、今回はSwipeRefreshLayoutの設定やメソッド呼び出しを追加しています。
SwipeRefreshLayoutでは、下方向へのスワイプ操作を検知すると、内部のビューの上端にプログレス表示のアニメーションが表示されます。デフォルトでは黒一色で分かりにくいため、Gmailと同様の色に設定しています(1)。
スワイプ操作が検知されると、リスナー(OnRefreshListener)のonRefreshメソッドが呼び出されます。サンプルではリスナー(インターフェース)は、InstagramFragmentに実装しています(2)。また、onRefreshメソッドでは、URLのリストをクリアして、ローダーを起動させています(4)。
なお、プログレス表示のアニメーションは、setRefreshingメソッドで任意に開始、停止させることができます(コールバックされたときは、自動で開始)(3)(5)。
アプリを起動すると、プログレス表示の後、画像のURLが表示されます(最大20個)。スワイプ操作すると、再度APIにアクセスして、次の20個のURLを取得、表示します。
最後に
今回は、画像のURLを取得するところまででした。次回は、実際に画像を表示する処理など、残りのコードを解説していきます。

