2013年10月18日金曜日

GridViewを使ってみる(ネット上から画像取得して表示する)

今回は、GridViewをネット上に置かれている画像で表示したいと思います。

流れとしては次のようになります。

1.APIにリクエストを投げて、その結果をJSON形式で受け取り解析する。
2.解析したデータを元に、表示する画像情報を取得してAdapterにセットする。
3.セットされたデータを元にAdapter内でVolleyを利用して画像を1つずつ読み込む。

という形になります。
画像の読み込みにはVolleyを使いますので、こちらの記事を参考にして設定を行ってください。
Volleyを使ってみる(ダウンロード&設定など)


■リクエストを受け付けるAPI側のソースコード(PHP)

画像にはGoogle先生の画像を拝借させて頂いていますシーッ! d( ゚ε゚;)
(画像は任意のやつを設定してください)
また、json形式のデータに変換するためにZend_Jsonを利用しています!
<?php
//
$aBody = array(
 array(
  "id" => 1,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 2,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 3,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 4,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 5,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 6,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 7,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 8,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 9,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 10,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 11,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 12,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 13,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 14,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 15,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 16,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 17,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 18,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 19,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 20,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 21,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 22,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 23,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),
 array(
  "id" => 24,
  "url" => "https://www.google.co.jp/images/srpr/logo4w.png",
 ),

);

try{
 
 $sEncode = Zend_Json::encode( $aBody );

 header("Content-Type: text/javascript; charset=utf-8");
 echo $sEncode;

}catch( Ces_Zend_Exception $e ){

 var_dump($e->getMessage());

}

//
exit(0);
■AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gridview5"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <!-- インターネットへのアクセスを許可 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.gridview5.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
■activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000">
    <GridView android:id="@+id/gridView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="auto_fit"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp">
    </GridView>
</LinearLayout>
■grid.xml

GridViewに画像を表示させるためレイアウトを変更させます。
<?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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 <ImageView  
   android:id="@+id/image"  
   android:layout_width="wrap_content"   
   android:layout_height="wrap_content" />
</RelativeLayout>

■MainActivity.java
package com.example.gridview5;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import com.android.volley.toolbox.ImageLoader.ImageCache;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

public class MainActivity extends Activity {

 //ログ出力時のタグ名
 private static final String TAG_LOG = "Log";
 //Volleyでリクエスト時に設定するタグ名。キャンセル時に利用する。
 private static final Object TAG_REQUEST_QUEUE = new Object();
 //画像のURL
 private static final String REQUEST_URL_REQUEST_JSON_ARRAY = "APIのリクエスト先のURL";
 //RequestQueueのインスタンス用
 private RequestQueue mRequestQueue;
    //ImageLoader
    private ImageLoader mImageLoader;
 //ImageLoaderのキャッシュ
    private ImageCache mCache; 
 //
 private ArrayList<HashMap> mHolderImages = new ArrayList<HashMap>();
 
 //
 // GirdView
 private GridView mGridView;
 private ArrayList<String> mList;
 //private ArrayAdapter<String> mArrayAdapter;
 private BitmapAdapter mArrayAdapter;

 // スクロール中か
 private static Boolean sScrolling = false;
 
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  //RequestQueueのインスタンス用を取得
  mRequestQueue = Volley.newRequestQueue(getApplicationContext());
  //初期化
  init();
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

 /*
  * 初期化
  */
 private void init(){
  
  //RequestQueueのインスタンス用を取得
  mRequestQueue = Volley.newRequestQueue(getApplicationContext());
  //
  requestJsonArray();
  
 }
 /*
  * HTTPリクエストを投げる(JSONArray)
  */
 private void requestJsonArray(){
  
  //
  long unixTime = System.currentTimeMillis() / 1000L;
  //
  String url = REQUEST_URL_REQUEST_JSON_ARRAY + "&" + String.valueOf(unixTime); 
  
  // リクエストを投げる
  JsonArrayRequest request = new JsonArrayRequest(
   url,
   new Response.Listener<JSONArray>(){
    @Override 
    public void onResponse(JSONArray response) {
     
     int length = response.length();
     
     //レスポンス受け取り時の処理
     if (length <= 0){
      //空の場合
      return;
     }
     
     
     
     for(int i = 0; i < length; i++){
      
      Log.d(TAG_LOG, String.valueOf(i) + "**************" + length);
      
      try {
       
       HashMap info = new HashMap();
       //
       JSONObject jsonObject = (JSONObject)response.get(i);
       Iterator it = jsonObject.keys();

       //登録されているキー値でループする
       while(it.hasNext()){
        
        //キー値を取得する
        String key = (String)it.next();
        //キーに紐づいてる値を取得する
        String value = jsonObject.getString(key);
        //
        info.put(key, value);
        
       }
       
       //
       info.put("loader", mRequestQueue);
       
       //配列に追加する
       mHolderImages.add(info);
       
      } catch (JSONException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
     
     //
//     Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG).show();
     
     loadImages();
     
    }
   },
   new Response.ErrorListener() {
    @Override 
    public void onErrorResponse(VolleyError error) {
     
     //エラー時の処理
     Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show();
     
    }
   }
  );
  //タグを設定する
  request.setTag(TAG_REQUEST_QUEUE);
  
  //リクエスト&レスポンス情報の設定を追加
  mRequestQueue.add(request);

  //リクエスト開始
  mRequestQueue.start(); 
  
 }
 
 /*
  * json結果のデータを元に画像の読み込み
  */
 private void loadImages(){
  
  Toast.makeText(getApplicationContext(), "loadImages START", Toast.LENGTH_LONG).show();

        //GridView取得
        mGridView = (GridView) findViewById(R.id.gridView1);
        
  /*
   * Adapter内で画像の読み込み 
   */
  //アダプター生成
  mArrayAdapter = new BitmapAdapter(this, R.layout.grid, mHolderImages);
  //アダプター設定
        mGridView.setAdapter(mArrayAdapter);
        
        
  /*
   * Item内で画像の読み込み
   */
  // スクロールのリスナーを設定
  mGridView.setOnScrollListener(new GridViewOnScrollListener());

  // クリックのリスナーを設定
  mGridView.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> parent, View v,
     int position, long id) {
    Toast.makeText(getApplicationContext(),
      "onItemClick : " + position, Toast.LENGTH_SHORT).show();
   }
  });

  // 長押しのリスナーを設定
  mGridView.setOnItemLongClickListener(new OnItemLongClickListener() {

   @Override
   public boolean onItemLongClick(AdapterView<?> parent, View v,
     int position, long id) {
    Toast.makeText(getApplicationContext(),
      "onItemLongClick : " + position, Toast.LENGTH_SHORT)
      .show();
    
    //選択している項目を削除する
    GridView grid = (GridView)parent;
    HashMap<?, ?> item = (HashMap<?, ?>)grid.getItemAtPosition(position);
    BitmapAdapter adapter = (BitmapAdapter)grid.getAdapter();
    adapter.remove(item);    
    
    // アダプターにデータ変更の通知
    adapter.notifyDataSetChanged();
    
    // GridViewの再描画
    mGridView.invalidateViews();
    
    // 長押しのイベント発生後にクリックイベントを発生させない為にfalseで返す
    return false;
   }

  });
  
 }
 


 /*
  * スクローラーの状態検知
  */
 public class GridViewOnScrollListener implements OnScrollListener {

  /*
   * ステータスが変わった時
   * 
   * @see
   * android.widget.AbsListView.OnScrollListener#onScrollStateChanged(
   * android.widget.AbsListView, int)
   */
  @Override
  public void onScrollStateChanged(AbsListView paramAbsListView,
    int scrollState) {
   switch (scrollState) {

   // スクロール停止
   case OnScrollListener.SCROLL_STATE_IDLE:

    // decode処理をqueueに登録して開始する記述
    Log.d("onScrollStateChanged", "idle");
    sScrolling = false;

    // アダプターにデータ変更の通知
    mArrayAdapter.notifyDataSetChanged();
    // GridViewの再描画
    mGridView.invalidateViews();

    break;

   // スクロール
   case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
    // decodeのqueueをキャンセルする処理を記述
    Log.d("onScrollStateChanged", "scroll");
    sScrolling = true;
    break;

   // フリック
   case OnScrollListener.SCROLL_STATE_FLING:
    // decodeのqueueをキャンセルする処理を記述
    Log.d("onScrollStateChanged", "fling");
    sScrolling = true;
    break;

   default:
    break;
   }
  }

  /*
   * スクロール中
   * 
   * @see
   * android.widget.AbsListView.OnScrollListener#onScroll(android.widget
   * .AbsListView, int, int, int)
   */
  @Override
  public void onScroll(AbsListView view, int firstVisibleItem,
    int visibleItemCount, int totalItemCount) {

   // 現在表示されているリストの末尾番号
   int displayCount = firstVisibleItem + visibleItemCount;

   /*
    * 
    * 初期でdisplayCountに数値が入ってるのに、totalItemCountが0の場合があるためスクロール中のみ判定するようにする
    * 。
    */
   if (displayCount < totalItemCount || !sScrolling) {
    return;
   }

  }

 } 
 
 /*
  * キャッシュ無し
  */
 private ImageCache getCacheNone(){
  
  //return new ImageNoCache();
  return new ImageCache(){
      @Override
      public Bitmap getBitmap(String url) {
          return null;
      }

      @Override
      public void putBitmap(String url, Bitmap bitmap) {
          // 処理なし
      }   
  };
  
 }

 
}
■BitmapAdapter.java

GridViewのアダプター用クラスになります。
画像の置き場所がベーシック認証配下なのでベーシック認証の処理が含まれています。
必要ない場合にはごっそり削っちゃってください(`・ω・´)シャキーン

最初に作った時には、Volleyにキャッシュを使わずに行っていましたが、
その状態だとスクロールした際に画面外に出た画像が、また読み込み中の画像に変わってしまって、
再度、画面内に表示された時に読み込みし直して?描画が始まるみたいな挙動になっていました(´;ω;`)ウッ…

ためしに動作を確認したい場合には、
ImageLoaderのインスタンスを生成している箇所を次のように変更してください。
//キャッシュを利用しない
mCache = getCacheNone();
//キャッシュを利用しない(キャッシュを利用しないと、画面から消えた画像は読み込み中画像になってしまう?)
mImageLoader = new ImageLoader(mRequestQueue, mCache);
BitmapAdapter.java
package com.example.gridview5;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
import com.android.volley.toolbox.ImageLoader.ImageCache;

import android.app.Activity;
import android.app.LauncherActivity.ListItem;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

/*
 * GridViewの子ビューへのアクセスを高速化対応
 * 
 */
class ViewHolder {  
 ImageView image;
}  

public class BitmapAdapter extends ArrayAdapter {

 private static final String TAG_LOG = "BitmapAdapter";
 
 private int resourceId;
 //
 private Context context = null;
 // アダプターに渡したリスト
 private ArrayList<HashMap> data = null;
 //
 private int resource = 0;
 //
 private LayoutInflater mInflater; 
 /*
  * 
  */
 //Volleyでリクエスト時に設定するタグ名。キャンセル時に利用する。
 private static final Object TAG_REQUEST_QUEUE = new Object();
 //RequestQueueのインスタンス用
 private RequestQueue mRequestQueue;
 //ImageLoader
 private ImageLoader mImageLoader;
 //ImageLoaderのキャッシュ
 private ImageCache mCache; 
 
 /*
  * コンストラクタ
  * @params Context コンテキスト
  * @params int 項目のレイアウトリソース
  * @params int リストの元となるデータ
  */
 public BitmapAdapter(Context context, int resource, ArrayList<HashMap> data) {
  //
  super(context, resource, data);
  
  //アクティビティ
  this.context = context;
  //GridViewに表示するデータ
  this.data = data;
  //レイアウトリソースID
  this.resource = resource;
  //コンストラクタで渡されたレイアウトのリソースIDから定義されている一番上のルートViewを取得するため、LayoutInflaterを保持する
  this.mInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

  /*
   * Volleyの初期化
   */
  //RequestQueueのインスタンス用を取得
  mRequestQueue = Volley.newRequestQueue(getContext());
  //キャッシュを利用する
  mImageLoader = new ImageLoader(mRequestQueue, new BitmapCache());
  
 }

 /*
  * リストの項目数を取得する
  * 
  * @see android.widget.ArrayAdapter#getCount()
  */
 public int getCount() {
  return data.size();
 }

 /*
  * position番号の項目を取得する
  * 
  * @see android.widget.ArrayAdapter#getItem(int)
  */
 public HashMap getItem(int position) {
  return data.get(position);
 }

 /*
  * position番号のidを取得する
  * 
  * @see android.widget.ArrayAdapter#getItemId(int)
  */
 public long getItemId(int position) {
  
  Log.d(TAG_LOG+"::getItemId", "position => " + String.valueOf(position) );
  //
  HashMap info = (HashMap)data.get(position);
  
  String key = "id";
  
  //キーがあるかチェック
  if( !info.containsKey(key) ){
   return 0;
  }
  //
  String id = (String)info.get(key);
  
  return Long.valueOf(id);
  //return data.get(position).getId();
 }

 /*
  * 
  * 1アイテム分のビューを取得。
  * @param Integer 
  *   ビューの何番目が必要になったか。
  * @param View
  *   可能な場合不要なビューを再利用する。膨大な量の情報を出力する場合にオブジェクトを可能な限り再利用する。
  *   nullの場合には再利用できるオブジェクトがないためオブジェクトを生成する。(まだ画面に表示されないため作成されていない)
  *   一度でも表示されていた場合には、returnで返されたviewが渡されてくるのでそのまま利用した方が早い。 
  * @param ViewGroup 
  *   選択されたAdapterのビューとなる。親View。GridViewになる。
  * 
  * @see android.widget.ArrayAdapter#getView(int, android.view.View,
  * android.view.ViewGroup)
  * 
  * 
  * 
  * 
  */
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {

  ViewHolder holder;
  
  //以前に一度生成されたGridViewのアイテムを再利用する。(画面外に移動したviewを再利用)
  //毎回、Viewをinflateで生成する方法は、XMLをパースするにも、メモリやCPUを使うので遅い。

  // Viewが無かった場合
  if (convertView == null) {
 
   // レイアウトファイルからルートViewを取得する(レイアウトに記述されているルートのViewになる)
   // 今回はRelativeLayoutになる。
   convertView = mInflater.inflate(resource, null);

   //Viewの中からImageViewを取得する
   ImageView image = (ImageView) convertView.findViewById(R.id.image);   
   
   //ViewHolder作成
   holder = new ViewHolder(); 
   //ImageViewへの参照を維持させる
   holder.image = image;  
   //タグとして登録
   convertView.setTag(holder); 
   
  }else{
   
   //保存してあるViewHolderを取得する
   holder = (ViewHolder) convertView.getTag();
  }
  
  //表示するデータを取得する
  HashMap item = (HashMap) getItem(position);
  
  //URLを取得する
  String url = (String)item.get("url");
  
  // 画像取得処理
  ImageListener listener = ImageLoader.getImageListener(
   //ImageView
   holder.image, 
   //読込中画像
   android.R.drawable.ic_menu_rotate,
   //読み込み失敗画像
   android.R.drawable.ic_delete
  );

  //
  mImageLoader.get(
   //取得URL
   url, 
   //リスナー
   listener,
   //maxWidth
   100,
   //maxHeight
   100
  );  
  //
  return convertView;

 }
 
 /*
  * キャッシュ無し
  */
 private ImageCache getCacheNone(){
  
  //return new ImageNoCache();
  return new ImageCache(){
      @Override
      public Bitmap getBitmap(String url) {
          return null;
      }

      @Override
      public void putBitmap(String url, Bitmap bitmap) {
          // 処理なし
      }   
  };
  
 }
}
■BitmapCache.java
Volleyのキャッシュ用のクラスファイルになります。
一度読み込んだ画像などは、Volleyがキャッシュから表示を行うようにします。
package com.example.gridview5;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class BitmapCache implements ImageCache {
    
   private LruCache<String, Bitmap> mCache;
    
   public BitmapCache() {
       int maxSize = 10 * 1024 * 1024;
       mCache = new LruCache<String, Bitmap>(maxSize) {
           @Override
           protected int sizeOf(String key, Bitmap value) {
               return value.getRowBytes() * value.getHeight();
           }
       };
   }

   @Override
   public Bitmap getBitmap(String url) {
       return mCache.get(url);
   }

   @Override
   public void putBitmap(String url, Bitmap bitmap) {
       mCache.put(url, bitmap);
   }

}
実行結果は次のようになります。

ローディング中の場合

読み込み完了時



さっきのはImageViewを使った方法でしたが、
Volleyで用意されているNetworkImageView(ImageViewの拡張)で画像の読み込みも可能です。

その場合にはBitmapAdapter.javaのファイルを次のように修正してください。
ただ、NetworkImageViewを使うと自由度が減ってしまうので、
複雑なGridViewを作りたい場合には使わない方が良いっぽいです!(゚д゚)(。_。)(゚д゚)(。_。) ウンウン

gird.xmlの変更(ImageViewをNetworkImageViewに変更する)
<com.android.volley.toolbox.networkimageview
 android:id="@+id/image" 
 android:layout_height="wrap_content" 
 android:layout_width="wrap_content"/>
BitmapAdapter.javaのViewHolderの変更
class ViewHolder {  
 NetworkImageView image;
} 
BitmapAdapter.javaのgetViewを変更
 /*
  * (non-Javadoc)
  * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
  */ 
 public View getView(int position, View convertView, ViewGroup parent) {

  ViewHolder holder;
  //以前に一度生成されたGridViewのアイテムを再利用する。(画面外に移動したviewを再利用)
  //毎回、Viewをinflateで生成する方法は、XMLをパースするにも、メモリやCPUを使うので遅い。
  
  // Viewが無かった場合
  if (convertView == null) {

   
   // レイアウトファイルからルートViewを取得する(レイアウトに記述されているルートのViewになる)
   // 今回はRelativeLayoutになる。
   convertView = mInflater.inflate(resource, null);
 
   //NetworkImageViewを取得する
   NetworkImageView image = (NetworkImageView)convertView.findViewById(R.id.image);
   //ViewHolder作成
   holder = new ViewHolder(); 
   //ImageViewへの参照を維持させる
   holder.image = image;  
   //タグとして登録
   convertView.setTag(holder);
   
  }else{
   
   //保存してあるViewHolderを取得する
   holder = (ViewHolder) convertView.getTag();
  }
  
  //表示するデータを取得する
  HashMap item = (HashMap) getItem(position);
  
  //URLを取得する
  String url = (String)item.get("url");
  
  //NetworkImageViewに画像の読み込み
  holder.image.setImageUrl(url, mImageLoader);
  
  //
  return convertView;

 }

以上です(`・ω・´)ゞビシッ!!

0 件のコメント:

コメントを投稿