android中Listview的優化技巧

  1. 減小內存中view對象的建立個數(明顯提升效率)
          複用歷史緩存的view對象,減小Android內存消耗java

  2. 減小子孩子(子控件)的查詢次數(控件較少時提升不明顯,大概5%)
          findviewbyid查詢比較費時,只查找一次,找到後存起來sql

  3. 分批分頁加載數據(避免數據過多形成內存不足)緩存

     1.直接利用sql語句查詢若干條數據,limit 數據量,offset 從哪開始ide

                 例如: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;
     }
相關文章
相關標籤/搜索