ScrollViewでListView、ScrollView、EditText、GridViewをネストする方法

2070 ワード

アイテムの必要に応じて、1つのListViewに別のListViewを入れます.つまり、1つのListViewの各ListItemに別のListViewを入れます.しかし、最初は、入れた小さなListViewが不完全に表示され、その高さには常に問題があることがわかります.インターネットで調べてみると、他の人もこのような問題に遭遇していることがわかりますが、多くの人はこのようなデザインをお勧めしません.デフォルトでAndroidはScrollViewに別のScrollViewを入れることが禁止されているので、その高さは計算できません.
また検索してみると、StackOverflow上の牛人がこの問題を解決していることが判明し、実験によって問題を解決できることが判明した.ListViewのAdapterを設定した後、ListViewのサブプロジェクトに基づいてListViewの高さを再計算し、その後、高さをLayoutParamsとしてListViewに設定することで、その高さが正しい.以下はソースコードである.
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に対する操作を詳細に説明し、表示するように設計されています.
参考資料:http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing