9

いくつかの項目ごとに とListViewがあり、それぞれに簡単な説明が付いています。アイテムと説明にさまざまなスタイルを適用するために、複数のスパン オブジェクトを使用しています: 、、、および。TextViewTextViewClickableSpanForegroundColorSpanBackgroundColorSpanAbsoluteSizeSpanStyleSpan

平均しListViewて には 10TextView秒あり、それぞれTextViewに 10 ペアのアイテム/説明があり、各ペアは約 6SpanObject秒を使用するため、合計SpanObjectListView. ユーザーがアイテムの 1 つをクリックすると、ListViewクリアされて再描画され、別の 600SpanObjectのセットが生成されます。

したがって、 s を span でTextViewスタイリングするのではなく、各項目と各説明に対して1 つ作成し、XML を介してフォーマットする方が良い考えではないかと考えています。TextViewTextViewSpanObject

注として、ビューの階層ツリーがより複雑になり、TextViews を作成するのにコストがかかるため、このアプローチから始めませんでしたが、作成しているSpanObjects の数をSpanObject確認したので、何を作成しているのかわかりません。優れている。また、リサイクル メカニズムの作成を開始することも考えていますが、それが価値があるかどうか、またはこれが Android GC の問題にならないかどうかはわかりません。

4

1 に答える 1

1

あなたがこの質問をしてから数年経っていることは知っていますが、今までに答えを見つけていただければ幸いですが、とにかくあなたの質問に答えたいと思いました.

あなたが持っている TextViews と SpanObjects の量は、あらゆる Android デバイスにとって信じられないほど高価であり、それらを毎回ロードすると、遅延が発生するだけでなく、OOM 関連のクラッシュ (メモリ不足) が発生する可能性があります。

これを解決するアプローチは、RecyclerView と CardView を使用することです。まず、RecyclerView アダプターを作成します。このクラス内で、各カード内のすべての TextView とその他のアイテムをロードする静的クラスを記述します (カードは基本的にリスト アイテムです)。このようにして、すべてのアイテムが OnCreate に読み込まれ、継続的に生成されることはありません。これは、フラグメントを使用している場合に特に役立ちます。このリンクは役に立つかもしれません: http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156

静的クラスを使用した RecyclerView アダプター クラスの例を次に示します。

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {

    private List<ContactInfo> contactList;

    public ContactAdapter(List<ContactInfo> contactList) {
            this.contactList = contactList;
    }

    @Override
    public int getItemCount() {
          return contactList.size();
    }

    @Override
    public void onBindViewHolder(ContactViewHolder contactViewHolder, int i) {
        ContactInfo ci = contactList.get(i);
        contactViewHolder.vName.setText(ci.name);
        contactViewHolder.vSurname.setText(ci.surname);
        contactViewHolder.vEmail.setText(ci.email);
        contactViewHolder.vTitle.setText(ci.name + " " + ci.surname);
   }

   @Override
   public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.
                    from(viewGroup.getContext()).
                    inflate(R.layout.card_layout, viewGroup, false);

        return new ContactViewHolder(itemView);
   }


   //Static class that loads all card item components

  public static class ContactViewHolder extends RecyclerView.ViewHolder {
     protected TextView vName;
     protected TextView vSurname;
     protected TextView vEmail;
     protected TextView vTitle;

     public ContactViewHolder(View v) {
          super(v);
          vName =  (TextView) v.findViewById(R.id.txtName);
          vSurname = (TextView)  v.findViewById(R.id.txtSurname);
          vEmail = (TextView)  v.findViewById(R.id.txtEmail);
          vTitle = (TextView) v.findViewById(R.id.title);
      }
 }
}
于 2015-08-11T01:48:13.753 に答える