Android ListViewでよく見られる最適化方法の詳細

2483 ワード

ListViewの最適化
ListViewにとって、レイアウトの中で最もよく使われるいくつかのコンポーネントの一つであるべきで、使用も非常に便利で、以下では2つの一般的な最適化方法を紹介する.
1.エントリの多重化の最適化
  • 実はlistviewの動作原理は、listviewが画面に見えるitem数を要求する場合、convertViewはgetViewでnullである.
  • しかし、画面が下にスライドすると(例えば、画面サイズが7本のteimを表示できる)、item 1が非表示になり、item 8が現れるとcovertViewの値はnullではなく、item 1が充填するためである.
  • で多重化処理をしないとitem 8はfindviewByIdに進み続けるので、実際にはitemごとのViewコントロールがIDが同じであることは、covertViewの多重化原理を利用してlistviewを最適化することでOOM異常を回避することができる.

  • 詳細は以下の図を参照してください.
    まとめ:上図の理解を通してlistviewのitemが多重化できることを知り、何によって多重化できるのか.AndroidはすでにgetView(final int position,View convertView,View Group parent)のconvertViewが多重化されたitemを処理するための方法を定義しているので、私たちは彼に処理すればいいのです.
    2.findviewbyidの最適化
    システムは子供idの方式を探します:左から右へ、木のモードと同じです.
    子供を探すたびに多くのリソースを消費しますが、子供のidは作成されています.
    つまり、彼らは固定されているということです.そうすれば、私たちは彼を最適化することができます.
    システムはR.idのモードを探して下図を見ます:
    まとめ:上の図の理解を通じて、findviewbyid(id)の下層操作が時間がかかりすぎることを知っています.もし1つのレイアウトの中に100層以上あれば、私はただ小さな「ImageView」を探しても半日探します.幸いなことに、2009年のgoogle IO大会では、googleのエンジニアがviewholderクラスをカスタマイズすることで、viewのidをバインドし、システム検索のような時間のかかる操作を減らす最適化方法を発表した.
    2つの最適化シナリオの実際のコードは次のとおりです.
    
    /**
     * @param position      
     * @param convertview   view
    
     *      view  .    view             
    
     * 1.      converview(     view),  view        
     * 2.         id      .     viewholder
     */
    
    @Override
    public View getView(final int position, View convertView,
        ViewGroup parent) {
      View view;
      ViewHolder holder;
      if (convertView != null) {
        //     view  
        view = convertView;
        holder = (ViewHolder) view.getTag();
      } else {
        //     view  
        view = View.inflate(getApplicationContext(),
            R.layout.item_callsmssafe, null);
        //               cpu   .
        //     view              id
        holder = new ViewHolder();
        holder.tv_mode = (TextView) view
            .findViewById(R.id.tv_black_mode);
        holder.tv_phone = (TextView) view
            .findViewById(R.id.tv_black_phone);
        holder.iv_delete_blacknumber = (ImageView) view
            .findViewById(R.id.iv_delete_blacknumber);
        view.setTag(holder);
    }
    
    
    /**
     *    id   
    */
    static class ViewHolder {
      TextView tv_phone;
      TextView tv_mode;
      ImageView iv_delete_blacknumber;
    }
    
    

    読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!