listview(android) で 3000 個のリスト項目を維持する必要がありますが、スクロールを続けるとエラーが発生します。これを管理するために、リストビューの読み込み中に進行状況ダイアログを表示する予定です。
Androidでのやり方を教えてください。
listview(android) で 3000 個のリスト項目を維持する必要がありますが、スクロールを続けるとエラーが発生します。これを管理するために、リストビューの読み込み中に進行状況ダイアログを表示する予定です。
Androidでのやり方を教えてください。
ここで問題にレイジーリストを使用できます。リンクを確認してください。あなたの解決策を見つけることができます。非同期タスクを使用できますが、3000 個のアイテム全体が一度に読み込まれます。LazyList を使用すると、最初に読み込まれるアイテムはほとんどなく、下にスクロールするとさらに多くのアイテムがリストに追加されます。
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;
}