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