android listView的优化内存

来源:互联网 发布:c语言指针编程题 经典 编辑:程序博客网 时间:2024/05/20 08:41

package cn.itcast.mobileguard;

import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.MemoryFile;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import cn.itcast.mobileguard.db.dao.BlackNumberDao;
import cn.itcast.mobileguard.domain.BlackNumber;

public class CallSmsSafeActivity extends Activity {
 public static final String TAG = "CallSmsSafeActivity";
 private ListView lv_call_sms_safe;
 private BlackNumberDao dao;
 private List<BlackNumber> blackNumbers;
 private LinearLayout ll_loading;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  setContentView(R.layout.activity_call_sms_safe);
  lv_call_sms_safe = (ListView) findViewById(R.id.lv_call_sms_safe);
  ll_loading = (LinearLayout) findViewById(R.id.ll_loading);
  dao = new BlackNumberDao(this);

  new AsyncTask<Void, Void, Void>() {

   @Override
   protected Void doInBackground(Void... params) {
    blackNumbers = dao.findAll();
    try {
     Thread.sleep(3000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    return null;
   }

   @Override
   protected void onPreExecute() {
    ll_loading.setVisibility(View.VISIBLE);
    super.onPreExecute();
   }

   @Override
   protected void onPostExecute(Void result) {
    ll_loading.setVisibility(View.INVISIBLE);
    lv_call_sms_safe.setAdapter(new CallSmsAdapter());
    super.onPostExecute(result);
   }

  }.execute();

  super.onCreate(savedInstanceState);
 }

 private class CallSmsAdapter extends BaseAdapter {

  public int getCount() {
   return blackNumbers.size();
  }

  public Object getItem(int position) {
   return blackNumbers.get(position);
  }

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

  public View getView(int position, View convertView, ViewGroup parent) {
   View view = null;
   ViewHolder holder;
   if (convertView != null && convertView instanceof RelativeLayout) {
    view = convertView;
    Log.i(TAG, "使用缓存view对象" + position);
    holder = (ViewHolder) view.getTag();
   } else {
    Log.i(TAG, "创建新的view对象" + position);
    view = View.inflate(getApplicationContext(),
      R.layout.layout_call_sms_item, null);
    holder = new ViewHolder();
    holder.tv_mode = (TextView) view
      .findViewById(R.id.tv_call_sms_item_mode);
    holder.tv_number =  (TextView) view
      .findViewById(R.id.tv_call_sms_item_number);
    //把textview对象的引用存放在 view对象里面.
    //减少了控件被查询的次数,只在控件被初始化 查询寻找控件
    view.setTag(holder);
   }
   BlackNumber blackNumber = blackNumbers.get(position);
   String mode = blackNumber.getMode();
   if ("phone".equals(mode)) {
    holder.tv_mode.setText("电话拦截");
   } else if ("sms".equals(mode)) {
    holder.tv_mode.setText("短信拦截");
   } else {
    holder.tv_mode.setText("全部拦截");
   }

   holder.tv_number.setText(blackNumber.getNumber());
   return view;
  }

 }
 
 static class ViewHolder{
  TextView tv_mode;
  TextView tv_number;
 }
}

原创粉丝点击