1

カスタム アダプター (ArrayAdapter および CursorAdapter) によって駆動される ListView がいくつかあります。アダプターの getView() および bindView() 関数で、ListView に行を作成し、行内の特定の UI 要素にリスナーを設定しています。

現在、ListView の行が Recycler に送信されると、リスナーはまだ接続されているため、メモリが解放されることはありません。行が破棄されるときのコールバックが表示されないため、行がリサイクルされる前にリスナーをデタッチする機会が得られます。

ListView 行でリスナーを管理するにはどうすればよいですか? リスナーを行に追加するための getView()/bindView() しかありませんが、それらを削除するものはありません。

ありがとう

4

2 に答える 2

0

ListView行ビューのリサイクルは Android OS が行います。ビューは、ユーザーがリストをスクロールするとオンザフライで生成され、ビューの外に出ると破棄されます。Android OS は、他のアプリケーションがより多くのメモリを必要とし、一部のオブジェクトが使用されていない場合に、ビューを破棄します。これはガベージ コレクションの一種です。

の削除に関する質問についてはlisteners、それらが指していたオブジェクトが存在しなくなり、ガベージオブジェクトとしてマークされるため、自動的に削除されます。

于 2012-05-18T23:02:24.990 に答える
0

いろいろ試した後、ViewHolder パターンを使用することにしました。その中に、リスナーを追跡する変数があります。リサイクルされたビューが提供されたら (該当する場合)、リスナーを取り出し (まだ存在します)、リスナーとしての登録を解除してから、新しいリスナーを作成してその場所に登録します。これはおそらくすべてのリスナーをキャッチするわけではありませんが、いくつかの ListView 行がメモリに残っていても問題ありません。

于 2012-05-22T17:35:17.197 に答える