Android:關於ListView以及包含了ScrollView時的滾動問題

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;
	}
注:本文所寫內容 已再也不推薦
相關文章
相關標籤/搜索