Android ListView

11568 ワード

英語の原文の住所は以下の通りです.http://developer.android.com/training/improving-layouts/smooth-scrolling.html
譲歩する ListView スムーズなスクロールの鍵は、プログラムの主スレッド(UIスレッド)を大量の処理から解放することである.ディスク、ネットワーク、またはSQLの操作は、単独のスレッドで行うことを保証します.あなたのプログラムの状態をテストしたいです.
バックグラウンドスレッドを使う
バックグラウンドスレッド(「作業スレッド」)を使用すると、主スレッドの中のドイツ圧が除去され、UIの作成に集中することができます.多くのケースで利用されています. Aync Task (非同期タスク)メインライン以外であなたの仕事を実行する簡単な方法を提供できます. Aync Task''は自動的にすべてを'uexecute() 行列を作って順番に実行してください.このような挙動は特定のプロセスに対して全体的であり、これは自分のスレッドを作成する心配がないことを意味する.
下に示す簡単なコードでは、*AsyncTask*を利用してバックグラウンドスレッドに画像をロードし、完成するとUIに適用されます.ロード中の画像の代わりにプログレスバーを表示することもできます.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//   AsyncTask             
new AsyncTask<ViewHolder, Void, Bitmap>() {
    private ViewHolder v;

    @Override
    protected Bitmap doInBackground(ViewHolder... params) {
        v = params[0];
        return mFakeImageLoader.getImage();
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        if (v.position == position) {
            //          ,      ,       
            v.progress.setVisibility(View.GONE);
            v.icon.setVisibility(View.VISIBLE);
            v.icon.setImageBitmap(result);
        }
    }}.execute(holder);
Android 3.0(API Level 11)から** Async Task*では、新しい機能が使用できます.これをオンにすることによって、複数のプロセッサのカーネル間でスレッドを交差させて実行することができます.呼び出し以外 execute()**メソッドは、利用可能なコアの数に応じて、***メソッドを使用して同時に複数の要求を実行することができます.
ビューオブジェクトをビューHolderに保存します.
コードがスライドしているかもしれません. ListView**は頻繁に**findView ById()**を呼び出しますが、これは効果を遅くすることができます.を回収するために、すでに表示されているビューに戻っても、これらの要素を探して更新してください.一つの循環は****findView ById()**を使う方法は「view holder」を使うデザインです.
オブジェクトのレイアウト内の各構成ビューのマークフィールドは、すぐにアクセスできます.繰り返して確認する必要はありません.まず、具体的なビューを保存するクラスを作る必要があります.たとえば:
1
2
3
4
5
6
static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;}
その後、**findViewById()*を充填してレイアウトに保存します.
1
2
3
4
5
6
ViewHolder holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
convertView.setTag(holder);
今は頻繁に確認する必要はなく、各ビューに簡単にアクセスできます.貴重なプロセッササイクルを節約します.