ViewHolderの使用

8686 ワード

ListViewを使用する場合、ViewHolderによるキャッシュによりパフォーマンスを向上
JavaBean,Newsオブジェクトのいくつかのパラメータtitle,detail,comment,imageUrlを作成しました
package com.ldw.newsView.domain;

public class News {
	
	private String title;
	private String detail;
	private String comment;
	private String iamgeUrl;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getDetail() {
		return detail;
	}
	public void setDetail(String detail) {
		this.detail = detail;
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
	public String getIamgeUrl() {
		return iamgeUrl;
	}
	public void setIamgeUrl(String iamgeUrl) {
		this.iamgeUrl = iamgeUrl;
	}
	@Override
	public String toString() {
		return "News [title=" + title + ", detail=" + detail + ", comment="
				+ comment + ", iamgeUrl=" + iamgeUrl + "]";
	}

}

レイアウトファイル
activity_main.xmlメインレイアウト、ListViewで埋め込み


    

ListViewのレイアウトファイル、それぞれのレイアウト
item_listview.xml


    
    
    
     
     
    

メインレイアウトファイルは、まずgetNewsInfoを呼び出してサブスレッドを利用してxmlを要求してxmlファイルの要素を解析し、同時に要素をListオブジェクトに配置し、setAdapterでリストのNewsオブジェクトをViewHolderで取得して各要素を解析して表示する
package com.ldw.newsView;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Xml;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.ldw.newsView.domain.News;
import com.loopj.android.image.SmartImageView;

public class MainActivity extends Activity {

	List newsList;
	Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg){
	        ListView lv = (ListView) findViewById(R.id.lv);
	        lv.setAdapter(new MyAdapter());
		}
	};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        getNewsInfo();
        //ListView lv = (ListView) findViewById(R.id.lv);
        //         ,      
        //lv.setAdapter(new MyAdapter());
    }
    
    class MyAdapter extends BaseAdapter{

    	//       ,  listView     
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return newsList.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			
			News news = newsList.get(position);
			View v = null;
			ViewHolder mHolder;
			if(convertView == null){
				v = View.inflate(MainActivity.this, R.layout.item_listview, null);
				//               ViewHolder   
				mHolder = new ViewHolder();
				mHolder.tv_title = (TextView) v.findViewById(R.id.tv_title);
				mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);
				mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);
				mHolder.siv = (SmartImageView) v.findViewById(R.id.siv);
				// ViewHolder     View   
				v.setTag(mHolder);
			}
			else{
				v = convertView;
				mHolder = (ViewHolder) v.getTag();
			}
			
			mHolder.tv_title.setText(news.getTitle());
			mHolder.tv_detail.setText(news.getDetail());
			mHolder.tv_comment.setText(news.getComment() + "   ");
			mHolder.siv.setImageUrl(news.getIamgeUrl());
			/*
			TextView tv_title = (TextView) v.findViewById(R.id.tv_title);
			tv_title.setText(news.getTitle());
			
			TextView tv_detail = (TextView) v.findViewById(R.id.tv_detail);
			tv_detail.setText(news.getDetail());
			
			TextView tv_comment = (TextView) v.findViewById(R.id.tv_comment);
			tv_comment.setText(news.getComment() + "   ");
			
			SmartImageView siv = (SmartImageView) v.findViewById(R.id.siv); 
			siv.setImageUrl(news.getIamgeUrl());
			*/
			return v;
		}
		
		class ViewHolder{
			//             ,          
			TextView tv_title;
			TextView tv_comment;
			TextView tv_detail;
			SmartImageView siv;
		}
    	
    }

    private void getNewsInfo(){
    	Thread t = new Thread(){
    		
    		@Override
    		public void run(){
    			String path="http://192.168.0.102:8080/news.txt";
    			
    			try {
					URL url = new URL(path);
					HttpURLConnection conn = (HttpURLConnection) url.openConnection();
					conn.setRequestMethod("GET");
					conn.setConnectTimeout(5000);
					conn.setReadTimeout(5000);
					//  http  ,        
					if(conn.getResponseCode() == 200){
						InputStream is = conn.getInputStream();
						//  pull     is 
						parseNewsXml(is);
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    			
    		}
    	};
    	
    	t.start();
    }
    
    private void parseNewsXml(InputStream is){
    	XmlPullParser xp = Xml.newPullParser();
    	try {
			xp.setInput(is, "utf-8");
			//            ,           
			int type = xp.getEventType();
			News news = null;
			while(type != XmlPullParser.END_DOCUMENT){
				switch(type){
				case XmlPullParser.START_TAG:
					if("newsList".equals(xp.getName())){
						newsList = new ArrayList();
					}
					else if("news".equals(xp.getName())){
						news = new News();
					}
					else if("title".equals(xp.getName())){
						String title = xp.nextText();
						news.setTitle(title);
					}
					else if("detail".equals(xp.getName())){
						String detail = xp.nextText();
						news.setDetail(detail);
					}
					else if("comment".equals(xp.getName())){
						String comment = xp.nextText();
						news.setComment(comment);
					}
					else if("image".equals(xp.getName())){
						String image = xp.nextText();
						news.setIamgeUrl(image);
					}
					break;
				case XmlPullParser.END_TAG:
					if("news".equals(xp.getName())){
						newsList.add(news);
					}
					break;
				}
				//       ,           ,        
				type = xp.next();
			}
			//         listView   ,           ,     
			handler.sendEmptyMessage(1);
			
			for(News n : newsList){
				System.out.println(n.toString());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }

}