AndroidレイアウトにおけるScrolViewとListViewの競合の最も簡単な方法

1880 ワード

ネット上で流行っている使い方の一つは
 
public class Utility {
        public static void setListViewHeightBasedOnChildren(ListView listView) {
            ListAdapter listAdapter = listView.getAdapter(); 
            if (listAdapter == null) {
                // pre-condition
                return;
            }

            int totalHeight = 0;
            for (int i = 0; i < listAdapter.getCount(); i++) {
                View listItem = listAdapter.getView(i, null, listView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }

            ViewGroup.LayoutParams params = listView.getLayoutParams();
            params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
            listView.setLayoutParams(params);
        }
    }

 
これは面倒くさいし、効果も明らかではありません.
 
以下のようにまとめられています.
 
ListViewのAdapterを設定した後にこの静的メソッドを呼び出すと、ListViewが親ListViewのListItemに正しく表示されます.ただし、サブListViewの各ItemはLinearLayoutでなければならないので、他のLayout(RelativeLayoutなど)はonMeasure()を書き換えていないため、onMeasure()で異常を投げ出すことに注意してください.
 
ScrollViewにListView(またはScrollView)がネストされているもう一つの問題は、サブScrollViewではスライドできない(完全に表示されていない場合)ことです.スライドイベントは親ScrollViewに食べられるので、サブScrollViewでもスライドできるようにするには、スライドイベントを強引に切り取るしかありません.牛の人がフォーラムでコードを送ったことがあります.自分でやってみたことはありませんが、できると思います.
ScrollViewでは、技術的な難題を解決するためにScrollViewが表示されますが、このような設計は、サブScrollViewの内容を容易に見ることができず、操作することができないため、非常に悪いユーザー体験です.たとえば、親ListViewの各Itemは概括的な記述のみを表示し、そのItemをクリックすると別のページに進み、このItemに対する操作を詳細に説明し、表示するように設計されています.
そこで、他の2つの簡単な方法を見つけました.そして、影響はありません.
 
1.ScrollViewに属性androidを追加する:fillViewport="true"でListViewをフルスクリーン表示できる
2.ListViewの高さを指定android:layout_height="420dp";