AndroidがListViewにListViewをネストする方法

1931 ワード

プロジェクトMRDの必要に応じて、1つのListViewに別のListView、すなわち、1つのListViewの各ListItemに別のListViewを入れる.しかし、最初は、入れた小さなListViewが不完全に表示されたり、空白が表示されたりして、その高さには常に問題があることがわかります.インターネットで調べてみると、他の人もこのような問題に遭遇していることがわかりますが、多くの人はこのようなデザインをお勧めしません.デフォルトでAndroidはScrollViewに別のScrollViewを入れることが禁止されているので、その高さは計算できません.
また検索してみると、StackOverflow上の牛人がすでにこの問題を解決していることが判明し、実験によって問題を解決できることが判明した.ListViewのAdapterを設定した後、ListViewのサブプロジェクトに基づいてListViewの高さを再計算し、高度をLayoutParamsとしてListViewに設定するという考え方で、その高さが正しい.ソースコードは次のとおりです.
    /**
     *     listview      
     * @param listView
     */
    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に対する操作を詳細に説明し、表示するように設計されています.