ListViewの効率テスト3

9348 ワード

前のテストを続け、
package cn.powerise.test01;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
* ListView
*
@author R9(QQ:34351088)
*/
public class List_Efficiency_3 extends ListActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

List<HashMap<String, Object>> data = null;
MyAdapter adapter = null;

data = getData();

adapter = new MyAdapter(this, data, R.layout.efficiency_item);
setListAdapter(adapter);
}

private List<HashMap<String, Object>> getData() {
List<HashMap<String, Object>> data = null;
HashMap<String, Object> item = null;

data = new ArrayList<HashMap<String, Object>>();
for (int i = 10; i < 40; i++) {
item = new HashMap<String, Object>();
item.put("image", R.drawable.icon);
item.put("id", i);
item.put("name", "Name" + i);
item.put("age", "Age" + i);
item.put("phone", "139073100" + i);
data.add(item);
}

return data;
}

static class ViewHolder {
ImageView imageView;
TextView idTextView;
TextView nameTextView;
TextView ageTextView;
TextView phoneTextView;
}

class MyAdapter extends BaseAdapter {

private List<HashMap<String, Object>> mData;
private LayoutInflater mInflater;
private int mResource;

public MyAdapter(Context context, List<HashMap<String, Object>> data, int resource) {
mData = data;
mResource = resource;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

/**
* ( )
*/
if (convertView == null) {
convertView = mInflater.inflate(mResource, null);
holder = new ViewHolder();
System.out.println("-->" + position);
holder.imageView = (ImageView) convertView.findViewById(R.id.iv_image);
holder.idTextView = (TextView) convertView.findViewById(R.id.txt_id);
holder.nameTextView = (TextView) convertView.findViewById(R.id.txt_name);
holder.ageTextView = (TextView) convertView.findViewById(R.id.txt_age);
holder.phoneTextView = (TextView) convertView.findViewById(R.id.txt_phone);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

HashMap<String, Object> dataSet = mData.get(position);

holder.imageView.setImageResource(R.drawable.icon);
holder.idTextView.setText(dataSet.get("id").toString());
holder.nameTextView.setText(dataSet.get("name").toString());
holder.ageTextView.setText(dataSet.get("age").toString());
holder.phoneTextView.setText(dataSet.get("phone").toString());

return convertView;
}

@Override
public int getCount() {
return mData.size();
}

@Override
public Object getItem(int position) {
return mData.get(position);
}

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

}
}

レイアウトファイルは前と同じです. 
このテストでは、前とは異なり、次のコードが追加されています.
static class ViewHolder {
  ImageView imageView;
  TextView idTextView;
  TextView nameTextView;
  TextView ageTextView;
  TextView phoneTextView;
}

getViewのコードを変更しました:
@Override
public View getView(int position, View convertView, ViewGroup parent) {

  ViewHolder holder;

  /**
  * ( )
  */
  if (convertView == null) {
    convertView = mInflater.inflate(mResource, null);
    holder = new ViewHolder();
    System.out.println("-->" + position);
    holder.imageView = (ImageView) convertView.findViewById(R.id.iv_image);
    holder.idTextView = (TextView) convertView.findViewById(R.id.txt_id);
    holder.nameTextView = (TextView) convertView.findViewById(R.id.txt_name);
    holder.ageTextView = (TextView) convertView.findViewById(R.id.txt_age);
holder.phoneTextView = (TextView) convertView.findViewById(R.id.txt_phone);
    convertView.setTag(holder);
  } else {
    holder = (ViewHolder) convertView.getTag();
  }

  HashMap<String, Object> dataSet = mData.get(position);

  holder.imageView.setImageResource(R.drawable.icon);
  holder.idTextView.setText(dataSet.get("id").toString());
  holder.nameTextView.setText(dataSet.get("name").toString());
  holder.ageTextView.setText(dataSet.get("age").toString());
  holder.phoneTextView.setText(dataSet.get("phone").toString());

  return convertView;
}

効率をさらに高め、findViewByIdを減らすことを目的としている.
 
小結:カスタムAdapter extends BaseAdapter
1.convertViewを取得する.
2.convertViewの各コンポーネントを取得する.
3.各コンポーネントに手動で付与.
また、ListView+CheckBox、ListView+RadioButtonについても、ここではこれ以上説明する.