私は長い間リストビューを使用してきましたが、突然、ランダムな動作を経験しました。リストビューで invalidateViews() を呼び出すと、場合によっては各行のビューが再膨張し、場合によってはそうではありません。これは完全にランダムです。それがどのように機能するかを正確に教えてもらえますか?理想的には、ビュー (行) 内のデータを更新するだけで、再び膨らませないようにする必要があります。
ありがとう
私は長い間リストビューを使用してきましたが、突然、ランダムな動作を経験しました。リストビューで invalidateViews() を呼び出すと、場合によっては各行のビューが再膨張し、場合によってはそうではありません。これは完全にランダムです。それがどのように機能するかを正確に教えてもらえますか?理想的には、ビュー (行) 内のデータを更新するだけで、再び膨らませないようにする必要があります。
ありがとう
ListViewでinvalidateViews()を呼び出し ても、ListView アイテム ビューが再膨張することはありません。ListView に項目ビューを強制的に再膨張させる唯一の方法は、リサイクルされたビューがクリアされることを意味し、ListView アダプターをリセットすることです (それを発見するためにソース コードを掘り下げる必要がありました)。
invalidateViews()メソッドの実装 (AbsListView.java のソース コード) を見ると、次のように表示されます (Android API 16) :
/**
* Causes all the views to be rebuilt and redrawn.
*/
public void invalidateViews() {
mDataChanged = true;
rememberSyncState();
requestLayout();
invalidate();
}
AdapterView.java に実装されている rememberSyncState()メソッドは、選択されたアイテム (ある場合) の ListView の位置を格納します。チェックアウトできます。
requestLayout ()メソッドは、(私の知る限り) 測定、レイアウト、および描画を処理するため、ここでも何もありません。
最後に、invalidate()を使用してリスト ビューを強制的に描画します (新しい測定値を使用して...)
そのため、 invalidateViews() を呼び出しても、リスト ビューが強制的にビューを再膨張することはありません。アダプターをどこかに再設定して、すべてのビューを再膨張させることはできますか?
アダプターの getView() メソッドには、最初にリストビューにデータを入力するときに null であるパラメーター convertView があり、後でリストビューをスクロール/無効化するときに convertView は null ではないため、使用でき、新しい行を膨らませる必要はありません
実際にlistview.invalidateViews()
は、すべてのビューが再構築および再描画されます。これは、invalidateViews() を選択しようとしたときに Eclipse で表示される説明を見るとわかります。