3

たとえば、リスト ビューの各行の高さが 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; 
   }
}
4

2 に答える 2

0

システムはリストビューを非常に効果的に処理します。アイテムが表示されず、Anthrod アイテムが表示される場合、システムは古いアイテム インスタンスを再利用します。アイテム コンテンツ ビューを View.GONE に設定した場合、アイテム インスタンスを取得すると、そのコンテンツ ビューの状態はまだ View.Gone であるため、アイテムのコンテンツを手動で View.VISIBLE に変更する必要があります。

于 2013-04-22T03:29:37.483 に答える