zoukankan      html  css  js  c++  java
  • 测试 ListView 的效率 3 [原创]

    继续前面的测试,

    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, 也是如此, 在此就不再多述了.



  • 相关阅读:
    公安的方案特点。
    12345
    js发送邮件 不会调用客户端。
    jsonp 跨域 jsonp 发音
    RESTful restful api Representational State Transfer
    Autofac 组件、服务、自动装配 《第二篇》
    Fiddler关闭自动更新
    武大樱花抢票软件使用说明
    Visual Studio实用小技巧
    C#6.0语法特性
  • 原文地址:https://www.cnblogs.com/xpxpxp2046/p/2314148.html
Copyright © 2011-2022 走看看