1

listview(android) で 3000 個のリスト項目を維持する必要がありますが、スクロールを続けるとエラーが発生します。これを管理するために、リストビューの読み込み中に進行状況ダイアログを表示する予定です。

Androidでのやり方を教えてください。

4

2 に答える 2

1

ここで問題にレイジーリストを使用できます。リンクを確認してください。あなたの解決策を見つけることができます。非同期タスクを使用できますが、3000 個のアイテム全体が一度に読み込まれます。LazyList を使用すると、最初に読み込まれるアイテムはほとんどなく、下にスクロールするとさらに多くのアイテムがリストに追加されます。

于 2013-02-18T06:46:01.360 に答える
0

ListView 自体は、多数のレコードをレンダリングするために使用できる素晴らしいコンポーネントです。 *メモリ リークと効率的な管理を回避するために、同じビューが何度も再利用されます。*

使用する必要があります: 画像のレイジー リストとビュー ホルダーは、ビューの再利用性を管理するために効率的に管理する必要があります。

リサイクルコンセプト:

ListView が画面に新しい行を表示する必要があるたびに、アダプターから getView() メソッドを呼び出します。ご存じのとおり、getView() は、行の位置、convertView、および親の ViewGroup の 3 つの引数を受け取ります。

convertView 引数は本質的に "ScrapView" です。ListView が行レイアウトのリサイクルを要求している場合、null 以外の値になります。したがって、convertView が null でない場合は、新しい行レイアウトを拡張するのではなく、単純にその内容を更新する必要があります。アダプタの getView() コードは次のようになります。

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);
    }

    TextView text = (TextView) convertView.findViewById(R.id.text);
    text.setText("Position " + position);

    return convertView;
}

ビュー ホルダー パターン インフレートされたレイアウト内の内部ビューを見つけることは、Android で最も一般的な操作の 1 つです。これは通常、findViewById() と呼ばれる View メソッドを介して行われます。このメソッドは、ビュー ツリーを再帰的に調べて、指定された ID コードを持つ子を探します。静的 UI レイアウトで findViewById() を使用することはまったく問題ありませんが、ご覧のとおり、ListView はスクロール時にアダプタの getView() を頻繁に呼び出します。特に行レイアウトが重要な場合、findViewById() は ListViews のスクロール パフォーマンスに影響を与える可能性があります。

View Holder パターンは、アダプターの getView() での findViewById() 呼び出しの数を減らすことに関するものです。実際には、ビュー ホルダーは行からすべての内部ビューへの直接参照を保持する軽量の内部クラスです。インフレートした後、行のビューにタグとして保存します。この方法では、最初にレイアウトを作成するときに findViewById() を使用するだけで済みます。ビュー ホルダー パターンが適用された前のコード サンプルを次に示します。

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);

        holder = new ViewHolder();
        holder.textView01 = (TextView) convertView.findViewById(R.id.text);

        convertView.setTag(holder);
    } else {
        holder = convertView.getTag();
    }

    holder.textView01.setText("Position " + position);

    return convertView;
}

private static class ViewHolder {
    public TextView textView01;
}
于 2013-02-18T07:23:14.960 に答える