ScrollView + Listview 實現方案優選

 

一,按

在開發中,最近常遇到這個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來處理


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章