问题1: 在listview中的中,在手指拖动listview,创建一个新的item的时候都会调用getView 方法,getview这个方法本身就比较消耗内存,假如listview要显示成百上千个条目,每次手指拖动时都要调用
getView方法去加载item,这是非常消耗内存的事件,会出现内存溢出
解决办法: 优化listview,复用历史缓存的view对象
问题2:在listView中
tv_number
=(TextView) view.findViewById(R.id.
tv_number
); 也是一件非常消耗内存的操作
解决办法:只是在创建view对象的时候去寻找控件,然后把控件的id引用存起来,复用历史缓存的view的时候复用存起来的控件id
---------------------------------------------------------
public
class
CallSmsSafeActivity
extends
Activity {
private
String
TAG
=
"CallSmsSafeActivity"
;
private
ListView
lv_callsms_safe
;
private
BlackNumberDao
dao
;
private
BlackNumberBean
blackNumberBean
;
private
List<BlackNumberBean>
numberList
;
private
TextView
tv_number
;
private
TextView
tv_mode
;
private
ImageView
iv_delete
;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_callsms_safe
);
dao
=
new
BlackNumberDao(
this
);
numberList
=
dao
.getNumberInfo();
lv_callsms_safe
=(ListView) findViewById(R.id.
lv_callsms_safe
);
lv_callsms_safe
.setAdapter(
new
MyAdapter());
}
/**
* 创建适配器
*/
public
class
MyAdapter
extends
BaseAdapter{
@Override
public
int
getCount() {
return
numberList
.size();
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
//复用历史缓存view对象,减少内存消耗,防止内存溢出
View view=
null
;
ViewHolder holder=
null
;
if
(convertView!=
null
&&convertView
instanceof
RelativeLayout){
//RelativeLayout:填充view的布局类型
view=convertView;
Log. i(
TAG
,
"复用历史缓存view:"
+position);
holder=(ViewHolder) view.getTag();
//复用孩子的id
}
else
{
view = View. inflate(getApplicationContext(), R.layout.
list_callsms_item
,
null
);
Log. i(
TAG
,
"创建新的view对象:"
+position);
holder=
new
ViewHolder();
//初始化view持有者
//只是在创建view的时候去寻找控件,然后把控件的id存起来
holder.
tv_number
=(TextView) view.findViewById(R.id.
tv_number
);
holder.
tv_mode
=(TextView) view.findViewById(R.id.
tv_mode
);
holder.
iv_delete
=(ImageView) view.findViewById(R.id.
iv_delete
);
view.setTag(holder);
//将holder存到view中
}
//非常消耗内存
//View view = View.inflate(getApplicationContext(), R.layout.list_callsms_item,null);
blackNumberBean
=
numberList
.get(position);
holder.
tv_number
.setText(
"号码:"
+
blackNumberBean
.getNumber());
String mode=
blackNumberBean
.getMode();
if
(
"1"
.equals(mode)){
holder.
tv_mode
.setText(
"电话拦截"
);
}
else
if
(
"2"
.equals(mode)){
holder.
tv_mode
.setText(
"短信拦截"
);
}
else
if
(
"3"
.equals(mode)){
holder.
tv_mode
.setText(
"全部拦截"
);
}
return
view;
}
@Override
public
Object getItem(
int
position) {
return
null
;
}
@Override
public
long
getItemId(
int
position) {
return
0;
}
}
/**
* 创建view持有者,将需要找的控件的应用放在 viewholder中
*/
static
class
ViewHolder{
TextView
tv_number
;
TextView
tv_mode
;
ImageView
iv_delete
;
}
}