1

私は長い間リストビューを使用してきましたが、突然、ランダムな動作を経験しました。リストビューで invalidateViews() を呼び出すと、場合によっては各行のビューが再膨張し、場合によってはそうではありません。これは完全にランダムです。それがどのように機能するかを正確に教えてもらえますか?理想的には、ビュー (行) 内のデータを更新するだけで、再び膨らませないようにする必要があります。

ありがとう

4

3 に答える 3

2

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() を呼び出しても、リスト ビューが強制的にビューを再膨張することはありませんアダプターをどこかに再設定して、すべてのビューを再膨張させることはできますか?

于 2013-08-26T06:58:08.740 に答える
0

アダプターの getView() メソッドには、最初にリストビューにデータを入力するときに null であるパラメーター convertView があり、後でリストビューをスクロール/無効化するときに convertView は null ではないため、使用でき、新しい行を膨らませる必要はありません

于 2013-08-26T06:14:36.630 に答える
0

実際にlistview.invalidateViews()は、すべてのビューが再構築および再描画されます。これは、invalidateViews() を選択しようとしたときに Eclipse で表示される説明を見るとわかります。

于 2013-08-26T06:12:26.507 に答える