たとえば、リスト ビューの各行の高さが 450 dp のリスト ビューがあるので、ほとんどの場合、リスト ビューは一度に 3 つの項目でレンダリングされます。
リストビューが最初に読み込まれるとき、各行は「詳細を表示」というボタンが付いた単なる画像です(すべて相対レイアウトに含まれています)。ユーザーがボタンをクリックすると、画像とボタンを持つ現在の相対レイアウトが非表示になりますsetVisibility(View.GONE) を呼び出して別のビュー (LinearLayout) を作成し、setVisibility(View.VISIBLE) を呼び出して表示します。
相対レイアウトと線形レイアウトの両方が、Adapter.getView() で膨張した同じ xml に存在することを覚えておいてください。可視性の観点から、一方を切り替えるだけです。
問題は、線形レイアウトで setVisibility(View.VISIBLE) を呼び出した後、表示されないことです。相対レイアウトは正常に非表示になりましたが、線形レイアウトは表示されませんでした。
リストビューを上下にスクロールして、リストビューの新しいアイテムをレンダリングする必要がある場合にのみ表示されます。
相対レイアウトを強制的に表示するにはどうすればよいですか? 強制再描画によって?無効化を呼び出して試しましたが、うまくいきませんでした。
私もrequestLayoutを試しましたが、やはり使い物になりません。
私もnotifyDataSetChanged()を試しましたが、うまくいきませんでした。アダプターのデータは何も変更されていないため、とにかく呼び出す必要はないと思います。新しいビューを非表示にして表示するだけです。
助けてください
編集:butcodeのヘルプに基づいていますが、機能しませんでした
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++) {
if(list.getItemAtPosition(vh.position)==list.getItemAtPosition(i)){
final View view = list.getChildAt(i-start);
final int index = i;
view.requestLayout();
lv.invalidateChild(view, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()));
runOnUiThread(new Runnable() {
@Override
public void run(){
//lv.invalidateChild(view, new Rect(view.getLeft(),
//view.getTop(), view.getRight(), view.getBottom()));
lv.requestChildRectangleOnScreen(view, new Rect(view.getLeft(),
view.getTop(), view.getRight(), view.getBottom()), false);
view.requestLayout();
list.getAdapter().getView(index, view, list);
}
});
break;
}
}