android中Listview的优化技巧

你离开我真会死。 提交于 2019-12-15 18:28:37

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

  1. 减少内存中view对象的创建个数(明显提高效率)
          复用历史缓存的view对象,减少Android内存消耗

  2. 减少子孩子(子控件)的查询次数(控件较少时提高不明显,大概5%)
          findviewbyid查询比较费时,只查找一次,找到后存起来

  3. 分批分页加载数据(避免数据过多造成内存不足)

     1.直接利用sql语句查询若干条数据,limit 数据量,offset 从哪开始

                 例如:select xx,xx from xxx order by _id desc limit ? offset ?
     
    2.当listview滚动到最后时候再加载offset个数据
                  1.为listview注册滚动事件的监听
                  2.onScrollStateChanged:三种状态
                          1.在空闲状态(idle)时候判断listview的滚动位置
                          2.getLastPOsition
                         3.新来的数据加到原来的后面
     3.滚动到最后的时候要提示用户数据已经全部加载完成了了,同时不在查询
     4.分页:当数据量特别大的时候,可以将数据分成若干页。一页加载完了,就直
     接后一页就 覆盖前一个,使用同一个集合即可

     

  4. //使用listView.setAdapter(new MyAdapter());
     class MyAdapter extends BaseAdapter {
      //一共有多少个item,一定要写
      @Override
      public int getCount() {
       return infos.size();
      }
      // 有多少个条目被使用,就调用多少次
      @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
       View view;
       ViewHolder viewHolder;
       //判断是否可以复用
       if (convertView == null) {
        Log.i(TAG, "创建新的view对象:" + position);
        // 把一个布局文件转化成 view对象。
        viewHolder = new ViewHolder();
        view = View.inflate(getApplicationContext(),R.layout.list_item_callsms, null);
        viewHolder.tv_number = (TextView) view.findViewById(R.id.tv_black_number);
        viewHolder.tv_mode = (TextView) view.findViewById(R.id.tv_block_mode);
        viewHolder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
        //当第一次找到控件的时候找到他们的引用,存放在记事本,放在父亲的口袋
        view.setTag(viewHolder);
       } else {
        // 复用原来的代码
        view = convertView;
        //取出存放的引用
        viewHolder = (ViewHolder) view.getTag();
       }
       
       //数据绑定
       viewHolder.tv_number.setText(infos.get(position).getNumber());
       String mode = infos.get(position).getMode();
       if ("1".equals(mode)) {
        viewHolder.tv_mode.setText("拦截短信");
       } else if ("2".equals(mode)) {
        viewHolder.tv_mode.setText("拦截电话");
       } else {
        viewHolder.tv_mode.setText("电话短信全部拦截");
       }
       
       return view;
      }
      @Override
      public Object getItem(int position) {
       // TODO Auto-generated method stub
       return null;
      }
      @Override
      public long getItemId(int position) {
       // TODO Auto-generated method stub
       return 0;
      }
     }
     /**
      * 减少子孩子(子控件)的查询次数,findviewbyid查询比较费时, 
      *  只查找一次,找到之后做一个标记,(记事本)把对应的关系记录下来
      * view对象的容器 记录孩子的内存地址。 相当于一个记事本
      */
     static class ViewHolder {
      TextView tv_number;
      TextView tv_mode;
      ImageView iv_delete;
     }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!