4.10 优化LIstView: 在listView中复用历史缓存view对象减少内存开销
2013-10-27 00:13
411 查看
问题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
{
[align=left]
[/align]
[align=left] private String TAG= "CallSmsSafeActivity";[/align]
[align=left] private ListView lv_callsms_safe;[/align]
private
BlackNumberDao dao;
private
BlackNumberBean blackNumberBean;
private
List<BlackNumberBean> numberList ;
[align=left] private TextView tv_number;[/align]
[align=left] private TextView tv_mode;[/align]
[align=left] private ImageView iv_delete;[/align]
[align=left] @Override[/align]
protected void onCreate(Bundle
savedInstanceState) {
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] setContentView(R.layout. activity_callsms_safe);[/align]
[align=left] [/align]
[align=left] dao= new BlackNumberDao( this);[/align]
[align=left] numberList= dao.getNumberInfo();[/align]
[align=left] [/align]
[align=left] [/align]
lv_callsms_safe=(ListView)
findViewById(R.id.lv_callsms_safe );
[align=left] lv_callsms_safe.setAdapter( new MyAdapter());[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 创建适配器[/align]
[align=left] */[/align]
[align=left] public class MyAdapter extends BaseAdapter{[/align]
[align=left]
[/align]
[align=left] [/align]
[align=left] @Override[/align]
public int getCount()
{
[align=left] [/align]
[align=left] return numberList.size();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] @Override[/align]
public View
getView( int position, View convertView, ViewGroup
parent) {
[align=left] [/align]
[align=left] //复用历史缓存view对象,减少内存消耗,防止内存溢出[/align]
[align=left] View view= null;[/align]
[align=left] ViewHolder holder= null;[/align]
[align=left] [/align]
[align=left] if(convertView!= null&&convertView instanceof RelativeLayout){ //RelativeLayout:填充view的布局类型[/align]
[align=left] view=convertView;[/align]
[align=left] Log. i(TAG , "复用历史缓存view:" +position);[/align]
[align=left] [/align]
[align=left] holder=(ViewHolder) view.getTag(); //复用孩子的id[/align]
[align=left] [/align]
[align=left] } else{[/align]
[align=left] view = View. inflate(getApplicationContext(), R.layout.list_callsms_item,null );[/align]
[align=left] Log. i(TAG , "创建新的view对象:" +position);[/align]
[align=left] [/align]
[align=left] holder= new ViewHolder(); //初始化view持有者[/align]
[align=left] [/align]
[align=left] //只是在创建view的时候去寻找控件,然后把控件的id存起来[/align]
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 );
[align=left] [/align]
[align=left] view.setTag(holder); //将holder存到view中[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //非常消耗内存[/align]
//View view = View.inflate(getApplicationContext(),
R.layout.list_callsms_item,null);
[align=left] [/align]
[align=left] [/align]
[align=left] blackNumberBean = numberList.get(position);[/align]
[align=left] holder. tv_number.setText( "号码:"+blackNumberBean .getNumber());[/align]
[align=left] String mode= blackNumberBean.getMode();[/align]
[align=left] if( "1".equals(mode)){[/align]
[align=left] holder. tv_mode.setText( "电话拦截");[/align]
[align=left] } else if( "2".equals(mode)){[/align]
[align=left] holder. tv_mode.setText( "短信拦截");[/align]
[align=left] } else if( "3".equals(mode)){[/align]
[align=left] holder. tv_mode.setText( "全部拦截");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] return view;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public Object
getItem( int position) {
[align=left] [/align]
[align=left] return null;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public long getItemId( int position)
{
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 创建view持有者,将需要找的控件的应用放在 viewholder中[/align]
[align=left] */[/align]
[align=left] static class ViewHolder{[/align]
[align=left] [/align]
[align=left] TextView tv_number;[/align]
[align=left] TextView tv_mode;[/align]
[align=left] ImageView iv_delete;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
解决办法: 优化listview,复用历史缓存的view对象
问题2:在listView中 tv_number=(TextView)
view.findViewById(R.id. tv_number);
也是一件非常消耗内存的操作
解决办法:只是在创建view对象的时候去寻找控件,然后把控件的id引用存起来,复用历史缓存的view的时候复用存起来的控件id
---------------------------------------------------------
public class CallSmsSafeActivity extends Activity
{
[align=left]
[/align]
[align=left] private String TAG= "CallSmsSafeActivity";[/align]
[align=left] private ListView lv_callsms_safe;[/align]
private
BlackNumberDao dao;
private
BlackNumberBean blackNumberBean;
private
List<BlackNumberBean> numberList ;
[align=left] private TextView tv_number;[/align]
[align=left] private TextView tv_mode;[/align]
[align=left] private ImageView iv_delete;[/align]
[align=left] @Override[/align]
protected void onCreate(Bundle
savedInstanceState) {
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] setContentView(R.layout. activity_callsms_safe);[/align]
[align=left] [/align]
[align=left] dao= new BlackNumberDao( this);[/align]
[align=left] numberList= dao.getNumberInfo();[/align]
[align=left] [/align]
[align=left] [/align]
lv_callsms_safe=(ListView)
findViewById(R.id.lv_callsms_safe );
[align=left] lv_callsms_safe.setAdapter( new MyAdapter());[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 创建适配器[/align]
[align=left] */[/align]
[align=left] public class MyAdapter extends BaseAdapter{[/align]
[align=left]
[/align]
[align=left] [/align]
[align=left] @Override[/align]
public int getCount()
{
[align=left] [/align]
[align=left] return numberList.size();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] @Override[/align]
public View
getView( int position, View convertView, ViewGroup
parent) {
[align=left] [/align]
[align=left] //复用历史缓存view对象,减少内存消耗,防止内存溢出[/align]
[align=left] View view= null;[/align]
[align=left] ViewHolder holder= null;[/align]
[align=left] [/align]
[align=left] if(convertView!= null&&convertView instanceof RelativeLayout){ //RelativeLayout:填充view的布局类型[/align]
[align=left] view=convertView;[/align]
[align=left] Log. i(TAG , "复用历史缓存view:" +position);[/align]
[align=left] [/align]
[align=left] holder=(ViewHolder) view.getTag(); //复用孩子的id[/align]
[align=left] [/align]
[align=left] } else{[/align]
[align=left] view = View. inflate(getApplicationContext(), R.layout.list_callsms_item,null );[/align]
[align=left] Log. i(TAG , "创建新的view对象:" +position);[/align]
[align=left] [/align]
[align=left] holder= new ViewHolder(); //初始化view持有者[/align]
[align=left] [/align]
[align=left] //只是在创建view的时候去寻找控件,然后把控件的id存起来[/align]
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 );
[align=left] [/align]
[align=left] view.setTag(holder); //将holder存到view中[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //非常消耗内存[/align]
//View view = View.inflate(getApplicationContext(),
R.layout.list_callsms_item,null);
[align=left] [/align]
[align=left] [/align]
[align=left] blackNumberBean = numberList.get(position);[/align]
[align=left] holder. tv_number.setText( "号码:"+blackNumberBean .getNumber());[/align]
[align=left] String mode= blackNumberBean.getMode();[/align]
[align=left] if( "1".equals(mode)){[/align]
[align=left] holder. tv_mode.setText( "电话拦截");[/align]
[align=left] } else if( "2".equals(mode)){[/align]
[align=left] holder. tv_mode.setText( "短信拦截");[/align]
[align=left] } else if( "3".equals(mode)){[/align]
[align=left] holder. tv_mode.setText( "全部拦截");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] return view;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public Object
getItem( int position) {
[align=left] [/align]
[align=left] return null;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] @Override[/align]
public long getItemId( int position)
{
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 创建view持有者,将需要找的控件的应用放在 viewholder中[/align]
[align=left] */[/align]
[align=left] static class ViewHolder{[/align]
[align=left] [/align]
[align=left] TextView tv_number;[/align]
[align=left] TextView tv_mode;[/align]
[align=left] ImageView iv_delete;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
相关文章推荐
- 安卓开发,listview的优化,减少内存消耗,复用convertView、ViewHolder和分页加载
- 复用历史缓存View对象解决ListView的OOM异常,使用句柄提高ListView显示效率(二)
- 内存泄露--contentView缓存使用与ListView优化
- 内存泄露--contentView缓存使用与ListView优化
- 内存泄露--contentView缓存使用与ListView优化
- Android杂谈--内存泄露(1)--contentView缓存使用与ListView优化
- android 使用内存缓存机制缓存图片,优化listview,recylerview
- 46黑名单显示的bug---(优化ListView)convertView复用带来的问题
- 使用ExpandableListView以及如何优化view的显示减少内存占用
- Android ListView适配器Adapter的使用,item的复用和ViewHolder优化
- contentView缓存使用与ListView优化
- Android项目:模仿ConvertView原理(ListView的getView方法)对View对象进行回收和复用 推荐
- listview加载性能优化之view的复用
- Android项目:模仿ConvertView原理(ListView的getView方法)对View对象进行回收和复用
- ListView优化-ViewHolder缓存
- 8/25/自定义Adapter缓存与时间优化/ListView、checkBox点击监听/addHeaderView/addFootView
- 自定义view,实现listview效果优化内存
- ListView的优化之复用convertView和利用ViewHolder
- Android之ListView异步加载网络图片(优化缓存机制)和对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- ListView优化-ViewHolder缓存