首页 > 代码库 > ListView优化

ListView优化

一、ListView简单优化

    复用view的历史缓存对象
    实例代码:
  1. public View getView(init position,View convertView,ViewGroup parent){
  2. View view;
  3. if(convertView!=null){
  4. view=convertView;
  5. }else{
  6. //创建新的view对象
  7. view=View.inflate(BlackNumberActivity.this,R.layout.black_number_item,null);
  8. }
  9. TextView tv=(TextView)findViewById(R.id.tv);//找到条目上的TextView控件
  10. }

    

二、ListView深度优化

原理:上面的优化方法中虽然将第一屏的view对象复用了历史缓存对象convertView,但是发现每次解析布局文件找到条目上的控件(即findViewById(R.id.tv))的时候很耗费资源

(注:找控件上的控件的过程就是解析xml文件,每调用一次findViewById就会在内存中解析一次xml文件所以比较耗费资源)

为了解决以上问题,我们可以这样做,定义一个静态内部类,随着外部类的加载该静态内部类里面的变量已加载到内存中,在加载第一屏条目的时候,就在内存中创建与屏幕上所能容纳的条目数量相同的对象,并且用setTag方法与条目上的控件绑定,这样条目上的控件就存储在第一次加载的时候存储在缓冲中,当复用历史缓存对象covertView的时候就不用再去解析xml文件了,这样就提高了效率节约了资源

1、定义一个容器,代码实现如下:

  1. static class ViewHolder{
  2. TextView tv_number;
  3. TextView tv_mode;
  4. }
2、当创建View的时候实例化容器
  1. ViewHolder holder;
  2. if(convertView!=null){
  3. view=convertView;
  4. holder=(ViewHolder)view.getTag();
  5. }else{
  6. //初始化容器
  7. holder=new ViewHolder();
  8. //设置该视图相关联的标记。一个标签可以用来标记一个视图层次结构
  9. //和层次结构内不必是唯一的。标签也可以用来存储数据在一个视图没有求助于另一个数据结构
  10. view.setTag(holder);
  11. }
3、使用
 
  1. holder.tv_number.setText(info.getNumber());
  2. if("1".equals(info.getMode())){
  3. holder.tv_mode.setText("拦截电话");
  4. }else if("2".equals(info.getMOde())){
  5. holder.tv_mode.setText("拦截短信");
  6. }else if("3".equals(info.getMode())){
  7. holder.tv_mode.setText("拦截电话+短信");
  8. }

综合使用:

  1. private class MyAdapter extends BaseAdapter {
  2. @Override
  3. public int getCount() {
  4. return list.size();
  5. }
  6. /**
  7. * convertView 缓存的view对象
  8. */
  9. @Override
  10. public View getView(final int position, View convertView, ViewGroup parent) {
  11. View view;
  12. ViewHolder holder = null;
  13. if (convertView != null) {
  14. view = convertView;
  15. // 从历史缓存的view中得到holder
  16. holder = (ViewHolder) view.getTag();
  17. Log.e(TAG, "===============历史缓存的view :" + position);
  18. } else {
  19. holder = new ViewHolder();
  20. view = View.inflate(BlackNumberActivity.this,
  21. R.layout.black_number_item, null);
  22. Log.e(TAG, "==========新建的view :" + position);
  23. // 把从view中得到的三个控件防盗holder中,就相当于缓存起来了
  24. holder.tv_number = (TextView) view.findViewById(R.id.tv_number);
  25. holder.tv_mode = (TextView) view.findViewById(R.id.tv_mode);
  26. holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
  27. // 把holder绑定给 view对象
  28. view.setTag(holder);
  29. }
  30. final BlackNumberInfo info = list.get(position);
  31. holder.iv_delete.setOnClickListener(new OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. delete(info);
  35. }
  36. });
  37. holder.tv_number.setText(info.getNumber());
  38. if ("1".equals(info.getMode())) {
  39. holder.tv_mode.setText("电话拦截");
  40. } else if ("2".equals(info.getMode())) {
  41. holder.tv_mode.setText("短信拦截");
  42. } else {
  43. holder.tv_mode.setText("全部拦截");
  44. }
  45. return view;
  46. }
  47. @Override
  48. public Object getItem(int position) {
  49. return null;
  50. }
  51. @Override
  52. public long getItemId(int position) {
  53. // TODO Auto-generated method stub
  54. return 0;
  55. }
  56. }
  57. static class ViewHolder {
  58. TextView tv_number;
  59. TextView tv_mode;
  60. ImageView iv_delete;
  61. }

 



来自为知笔记(Wiz)


ListView优化