一,按
在開發中,最近常遇到這個UI的結構,遇到了不少問題,如下:
1, listview的高度不對
2, 頁面閃動,不在最開始的位置
3, 如果listview的item需要改變高度,listview的高度不能正常更新
二,解決方案一:動態計算listview高度
1, 具體函數請百度之,原理就是item高度加上divider高度
2, 侷限:
2-1 使用麻煩,需要listview可能改變的地方調用
2-2 頁面在部分機型上,仍然存在閃動的問題
3, 參考代碼如下:
public 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(); } System.out.println("aaa==="+totalHeight); ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); }
三,解決方案二:使用自定義Listview
1, 使用自定義ListView,修改onMeasure()方法即可
參考代碼如下:
public class InScrollListView extends ListView{ public InScrollListView(Context context) { super(context); } public InScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
2, 侷限:
2-1 頁面在部分機型上,仍然存在閃動的問題
2-2 如果有點擊事件需要修改item的高度,則需要wapper一層,具體實現方式就是將item是否是展開的狀態,包在數據結構中。點擊事件之後,update data,然後再notify adapter
四,解決方案三:利用Listview的Header (推薦方案)
1, 拆解頁面view,採用addHeader(View v)的方法將view加到listview中去。
2, 侷限:
2-1 相對麻煩一些,但是實現效果是最好的。另外一個優點是,魅族機器上,scrollview滑動會有很奇怪的問題,換成Listview之後,也不存在這個問題。
3, 可能會遇到的問題
3-1 head view真正被加入listview的時機是setAdapter之後
3-2 控制head view的顯示,可以才從內置wrapperlayout來處理