1、分析 java
一、最簡單的佈局:只有一個ListView android
若是整個頁面只有一個ListView的話,那麼因爲ListView自己帶有滾動效果,因此當加載的數據超過頁面顯示的範圍時,能夠經過上下滑動來查看全部的item。
所以這種狀況下,不須要添加ScrollView。 ide
二、其它佈局A+ListView 佈局
這種狀況下,若是佈局A定義在ListView的前面,那麼當佈局A所佔的比例較大,或者ListView加載的數據較多時,都會致使ListView顯示不徹底。一樣,因爲ListView自身能夠滾動,所以仍然能夠經過上下滾動來查看ListView的全部item。
如圖所示:
測試
三、其它佈局B+ListView this
這種狀況下,假設佈局B定義在ListView的後面,那麼就會出現兩種狀況:
(1)、ListView加載的數據很少,能夠徹底顯示ListView的每一項,那麼若是後面還有足夠剩餘的空間的話,佈局B能正常顯示;
(2)、ListView加載的數據加多,那麼就會致使留給佈局B的空間不足,或者根本就沒有,佈局B將會顯示不徹底或者徹底不顯示。
而無論怎麼,ListView自己的內容,均可以經過滑動來查看。 spa
對於第三種狀況,若是不從新考慮佈局的話,那麼就須要添加ScrollView,用於查看剩餘頁面內容。 code
2、ScrollView和ListView的衝突問題 ip
一、給ListView指定一個高度
例如設置android:layout_height="240dip",那麼能夠解決,可能會影響美觀。
如圖所示:
get
二、外面再添加個ScrollView
這種狀況下,會出現問題。如圖所示:
三、給ScrollView設置屬性:android:fillViewport="true"
測試的時候發現,若是ListView加載的數據很少的話,確實能夠解決,可是當ListView加載的數據較多的時候,仍舊沒法顯示徹底,而且這個時候ListView自身也沒法滾動了。
3、解決辦法
網上有一些解決方法,好比計算ListView的高度,就是不知道當ListView每一項的item高度不肯定(不必定都一致)的時候,這樣處理是否可行。
附:整理了網上的一種解決方法,實際測試效果還不錯。
public class ListViewTestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sub_menu2); ListView listView = (ListView) findViewById(R.id.sub_menu_list); MyAdapter adapter = new MyAdapter(this, addMapToList()); listView.setAdapter(adapter); setListViewHeightBasedOnChildren(listView); } /** * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { 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); } /** * 將map類型的數據添加到列表 * * @return dataList */ private List<HashMap<String, String>> addMapToList() { List<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>(); HashMap<String, String> map; for (int i = 0; i < 18; i++) { map = new HashMap<String, String>(); map.put("name", "Item-" + (i + 1)); dataList.add(map); } return dataList; }注:本文所寫內容 已再也不推薦