はてなPhoto一覧を表示してみる

Androidのアプリを触り始めたのだが、サンプルが充実している。
ただ、ネット経由ってのがよくわからない。

とりあえず、以前にRSSを取得するコードを再利用し、はてなPhoto一覧を
取得し表示してみる。

サンプルを流用。
まず、最初に呼ばれるクラス

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rss_main);
        
        hatenaBtn = (Button)findViewById(R.id.btn_hatena);
        rssBtn = (Button)findViewById(R.id.btn_kronos);
        wikiBtn = (Button)findViewById(R.id.btn_wiki);
        
        hatenaBtn.setOnClickListener(this);
        rssBtn.setOnClickListener(this);
        wikiBtn.setOnClickListener(this);
    }

	public void onClick(View bundle) {
		if(bundle == hatenaBtn) {
	    	//CalledActivityの呼び出し
            Intent intent=new Intent(this,net.kronos.rss.act.GalleryActivity.class);            
            startActivityForResult(intent,RESULT_OK);
		} else if(bundle == rssBtn) {
			Intent intent = new Intent(this,net.kronos.rss.act.Transition3d.class);
			startActivityForResult(intent, RESULT_OK);
		} else if(bundle == wikiBtn) {
			
		}
	}

はてな以外にも色々いじってたので、会社のRSS取得とかも入ってますが・・・
そこは気にしないで。

さて、次にActivityを継承した実際に取得して画面へデータを仲介する所ですが、
全部乗せるとえらいことになるので、抜粋。

        holder = (HatenaPhotoResourceHolder)this.getPhotoList();
        
	List<String> imgUrlList = holder.getImageUri();
		
	ImageAdapter adapter = new ImageAdapter(this);
		
	adapter.setImage(imgUrlList.toArray(new String[0]));
		
	Gallery gallery = (Gallery)findViewById(R.id.Gallery01);
				
	imageSwitcher = (ImageSwitcher)findViewById(R.id.ImageSwitcher01);
	imageSwitcher.setFactory(this);
	imageSwitcher.setClickable(true);
	imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
	imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
	imageSwitcher.setImageURI(holder.next().getImgUrl());
		
	gallery = (Gallery) findViewById(R.id.Gallery01);		
	gallery.setAdapter(adapter);
	gallery.setOnItemSelectedListener(this);

ImageAdapter

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {

	private Context myContext;
	
	private String[] imageUris = {};
	
	public ImageAdapter(Context c) {
		this.myContext = c;
	}
	
	public int getCount() {
		return this.imageUris.length;
	}

	public Object getItem(int position) {
		return position;
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView i = new ImageView(this.myContext);
        HttpURLConnection http = null;
        InputStream in = null;
        URL url = null;
        BufferedInputStream bis = null;
        Bitmap bm = null;
        try {
             // 指定した URL の作成
             url = new URL(imageUris[position]);
             // HTTP通信の初期化
             http = (HttpURLConnection) url.openConnection();
             // HTTP通信のメソッド指定(今回はダウンロードのみなので GET を指定)
             http.setRequestMethod("GET");
             // HTTP通信開始
             http.connect();
             // HTTP通信でデータを取得
             in = http.getInputStream();
             bis = new BufferedInputStream(in);
             // 取得したデータを Bitmap へ変換
             bm = BitmapFactory.decodeStream(bis);
             i.setImageBitmap(bm);
        } catch (Exception e) {
             e.printStackTrace();
        } finally{
             // HTTP 通信の後始末
             try{
                 in.close();
             } catch (Exception e) {}
             try {
                 http.disconnect();
		     } catch (Exception e) {}
        }
        // スケールタイプを設定
        i.setScaleType(ImageView.ScaleType.FIT_CENTER);
        i.setLayoutParams(new Gallery.LayoutParams(150, 200));
        
        return i;
 		
	}

	public float getScale(boolean focused,int offset) {
		return Math.max(0, 1.0f / (float)Math.pow(2, Math.abs(offset)));
	}
	
	public void setImage(String[] imgeurls) {
		this.imageUris = imgeurls;
	}
	
	private String getFilename(String url) {
		String filename = null;
		
		int pos = url.lastIndexOf("/");
		filename = url.substring(pos);
		
		return filename;
	}
}

ここで失敗。HttpCilentがあるのを後で気づいたw
後ほど、実装しなおすとして。
ここで、getViewメソッドだが、毎回呼ばれる?
いや、画像を取得する際には呼ばれるだろうが、
画像きりかえ(Gallery)の際もいってるのかな・・・
emulatorでも、実機でも画像がカクカクする。

とりあえず、id:minghaiさんのソースコード参考に
再度作り直しか。