天天看點

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題

在一個滑動控件或者是布局裡面,添加另外一個可以滑動的控件,通常會造成一些莫名其妙的問題。今天主要介紹在工作中遇到的,在ScrollView布局中嵌套Listview顯示不正常,和在Listview中嵌套Listview的滑動沖突的問題。

1.ScrollView布局中嵌套Listview顯示不正常的解決方案

目前來說,解決這個問題有好幾種解決方案,這裡隻介紹其中兩種比較簡單易行的其中兩種。

(1)自定義一個Listview,繼承自Listview,代碼如下:

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class ListViewForScrollView extends ListView {  
  2.     public ListViewForScrollView(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public ListViewForScrollView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public ListViewForScrollView(Context context, AttributeSet attrs,  
  9.             int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.     }  
  12.     @Override  
  13.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  14.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
  15.                 MeasureSpec.AT_MOST);  
  16.         super.onMeasure(widthMeasureSpec, expandSpec);  
  17.     }  
  18. }  

在使用的時候,用這個控件代替Listview控件即可。

(2)重新計算Listview的高度

在一個滑動布局中添加一個滑動控件,滑動控件的高度因為不能計算,是以隻能顯示一個Item,若要解決這個問題,我們可以重新計算Listview的高度,調用下面的靜态方法即可。

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1.     public static void setListViewHeightBasedOnChildren(ListView listView) {  
  2.         ListAdapter listAdapter = listView.getAdapter();  
  3.         if (listAdapter == null) {  
  4.             return;  
  5.         }  
  6.         int totalHeight = 0;  
  7.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  8.             View listItem = listAdapter.getView(i, null, listView);  
  9.             listItem.measure(0, 0);  
  10.             totalHeight += listItem.getMeasuredHeight();  
  11.         }  
  12.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  13.         params.height = totalHeight  
  14.                 + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  15.         listView.setLayoutParams(params);  
  16.     }  

2.在Listview中嵌套Listview的滑動沖突問題

之前在項目中,出現了這種需求,就是在一個listview的footer中添加一個小的Listview,但是由于觸摸沖突問題,小的listview不能滑動,若要解決這個問題,我們可以自定義一個控件繼承自listview,然後重寫onInterceptTouchEvent方法,對觸摸事件進行分發。

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,我們可以在這個方法裡面,對子控件或者是父控件擷取觸摸處理權限進行分發,進而完成各自的滑動任務。

效果圖如下

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題

代碼如下

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class InnerListview extends ListView {  
  2.     public InnerListview(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public InnerListview(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public InnerListview(Context context, AttributeSet attrs, int defStyle) {  
  9.         super(context, attrs, defStyle);  
  10.     }  
  11.     @Override  
  12.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  13.         switch (ev.getAction()) {  
  14.         // 當手指觸摸listview時,讓父控件交出ontouch權限,不能滾動  
  15.         case MotionEvent.ACTION_DOWN:  
  16.             setParentScrollAble(false);  
  17.         case MotionEvent.ACTION_MOVE:  
  18.             break;  
  19.         case MotionEvent.ACTION_UP:  
  20.         case MotionEvent.ACTION_CANCEL:  
  21.             // 當手指松開時,讓父控件重新擷取onTouch權限  
  22.             setParentScrollAble(true);  
  23.             break;  
  24.         }  
  25.         return super.onInterceptTouchEvent(ev);  
  26.     }  
  27.     // 設定父控件是否可以擷取到觸摸處理權限  
  28.     private void setParentScrollAble(boolean flag) {  
  29.         getParent().requestDisallowInterceptTouchEvent(!flag);  
  30.     }  
  31. }  

這樣,外面的listview和裡面的小listview就都可以實作各自的滑動了。

    項目位址 https://github.com/ZhaoKaiQiang/InnerListview

轉自:

在一個滑動控件或者是布局裡面,添加另外一個可以滑動的控件,通常會造成一些莫名其妙的問題。今天主要介紹在工作中遇到的,在ScrollView布局中嵌套Listview顯示不正常,和在Listview中嵌套Listview的滑動沖突的問題。

1.ScrollView布局中嵌套Listview顯示不正常的解決方案

目前來說,解決這個問題有好幾種解決方案,這裡隻介紹其中兩種比較簡單易行的其中兩種。

(1)自定義一個Listview,繼承自Listview,代碼如下:

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class ListViewForScrollView extends ListView {  
  2.     public ListViewForScrollView(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public ListViewForScrollView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public ListViewForScrollView(Context context, AttributeSet attrs,  
  9.             int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.     }  
  12.     @Override  
  13.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  14.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
  15.                 MeasureSpec.AT_MOST);  
  16.         super.onMeasure(widthMeasureSpec, expandSpec);  
  17.     }  
  18. }  

在使用的時候,用這個控件代替Listview控件即可。

(2)重新計算Listview的高度

在一個滑動布局中添加一個滑動控件,滑動控件的高度因為不能計算,是以隻能顯示一個Item,若要解決這個問題,我們可以重新計算Listview的高度,調用下面的靜态方法即可。

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1.     public static void setListViewHeightBasedOnChildren(ListView listView) {  
  2.         ListAdapter listAdapter = listView.getAdapter();  
  3.         if (listAdapter == null) {  
  4.             return;  
  5.         }  
  6.         int totalHeight = 0;  
  7.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  8.             View listItem = listAdapter.getView(i, null, listView);  
  9.             listItem.measure(0, 0);  
  10.             totalHeight += listItem.getMeasuredHeight();  
  11.         }  
  12.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  13.         params.height = totalHeight  
  14.                 + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  15.         listView.setLayoutParams(params);  
  16.     }  

2.在Listview中嵌套Listview的滑動沖突問題

之前在項目中,出現了這種需求,就是在一個listview的footer中添加一個小的Listview,但是由于觸摸沖突問題,小的listview不能滑動,若要解決這個問題,我們可以自定義一個控件繼承自listview,然後重寫onInterceptTouchEvent方法,對觸摸事件進行分發。

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,我們可以在這個方法裡面,對子控件或者是父控件擷取觸摸處理權限進行分發,進而完成各自的滑動任務。

效果圖如下

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題

代碼如下

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class InnerListview extends ListView {  
  2.     public InnerListview(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public InnerListview(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public InnerListview(Context context, AttributeSet attrs, int defStyle) {  
  9.         super(context, attrs, defStyle);  
  10.     }  
  11.     @Override  
  12.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  13.         switch (ev.getAction()) {  
  14.         // 當手指觸摸listview時,讓父控件交出ontouch權限,不能滾動  
  15.         case MotionEvent.ACTION_DOWN:  
  16.             setParentScrollAble(false);  
  17.         case MotionEvent.ACTION_MOVE:  
  18.             break;  
  19.         case MotionEvent.ACTION_UP:  
  20.         case MotionEvent.ACTION_CANCEL:  
  21.             // 當手指松開時,讓父控件重新擷取onTouch權限  
  22.             setParentScrollAble(true);  
  23.             break;  
  24.         }  
  25.         return super.onInterceptTouchEvent(ev);  
  26.     }  
  27.     // 設定父控件是否可以擷取到觸摸處理權限  
  28.     private void setParentScrollAble(boolean flag) {  
  29.         getParent().requestDisallowInterceptTouchEvent(!flag);  
  30.     }  
  31. }  

這樣,外面的listview和裡面的小listview就都可以實作各自的滑動了。

    項目位址 https://github.com/ZhaoKaiQiang/InnerListview

http://blog.csdn.net/zhaokaiqiang1992/article/details/38585547

在一個滑動控件或者是布局裡面,添加另外一個可以滑動的控件,通常會造成一些莫名其妙的問題。今天主要介紹在工作中遇到的,在ScrollView布局中嵌套Listview顯示不正常,和在Listview中嵌套Listview的滑動沖突的問題。

1.ScrollView布局中嵌套Listview顯示不正常的解決方案

目前來說,解決這個問題有好幾種解決方案,這裡隻介紹其中兩種比較簡單易行的其中兩種。

(1)自定義一個Listview,繼承自Listview,代碼如下:

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class ListViewForScrollView extends ListView {  
  2.     public ListViewForScrollView(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public ListViewForScrollView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public ListViewForScrollView(Context context, AttributeSet attrs,  
  9.             int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.     }  
  12.     @Override  
  13.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  14.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
  15.                 MeasureSpec.AT_MOST);  
  16.         super.onMeasure(widthMeasureSpec, expandSpec);  
  17.     }  
  18. }  

在使用的時候,用這個控件代替Listview控件即可。

(2)重新計算Listview的高度

在一個滑動布局中添加一個滑動控件,滑動控件的高度因為不能計算,是以隻能顯示一個Item,若要解決這個問題,我們可以重新計算Listview的高度,調用下面的靜态方法即可。

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1.     public static void setListViewHeightBasedOnChildren(ListView listView) {  
  2.         ListAdapter listAdapter = listView.getAdapter();  
  3.         if (listAdapter == null) {  
  4.             return;  
  5.         }  
  6.         int totalHeight = 0;  
  7.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  8.             View listItem = listAdapter.getView(i, null, listView);  
  9.             listItem.measure(0, 0);  
  10.             totalHeight += listItem.getMeasuredHeight();  
  11.         }  
  12.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  13.         params.height = totalHeight  
  14.                 + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  15.         listView.setLayoutParams(params);  
  16.     }  

2.在Listview中嵌套Listview的滑動沖突問題

之前在項目中,出現了這種需求,就是在一個listview的footer中添加一個小的Listview,但是由于觸摸沖突問題,小的listview不能滑動,若要解決這個問題,我們可以自定義一個控件繼承自listview,然後重寫onInterceptTouchEvent方法,對觸摸事件進行分發。

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,我們可以在這個方法裡面,對子控件或者是父控件擷取觸摸處理權限進行分發,進而完成各自的滑動任務。

效果圖如下

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題

代碼如下

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class InnerListview extends ListView {  
  2.     public InnerListview(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public InnerListview(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public InnerListview(Context context, AttributeSet attrs, int defStyle) {  
  9.         super(context, attrs, defStyle);  
  10.     }  
  11.     @Override  
  12.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  13.         switch (ev.getAction()) {  
  14.         // 當手指觸摸listview時,讓父控件交出ontouch權限,不能滾動  
  15.         case MotionEvent.ACTION_DOWN:  
  16.             setParentScrollAble(false);  
  17.         case MotionEvent.ACTION_MOVE:  
  18.             break;  
  19.         case MotionEvent.ACTION_UP:  
  20.         case MotionEvent.ACTION_CANCEL:  
  21.             // 當手指松開時,讓父控件重新擷取onTouch權限  
  22.             setParentScrollAble(true);  
  23.             break;  
  24.         }  
  25.         return super.onInterceptTouchEvent(ev);  
  26.     }  
  27.     // 設定父控件是否可以擷取到觸摸處理權限  
  28.     private void setParentScrollAble(boolean flag) {  
  29.         getParent().requestDisallowInterceptTouchEvent(!flag);  
  30.     }  
  31. }  

這樣,外面的listview和裡面的小listview就都可以實作各自的滑動了。

    項目位址 https://github.com/ZhaoKaiQiang/InnerListview

http://blog.csdn.net/zhaokaiqiang1992/article/details/38585547

在一個滑動控件或者是布局裡面,添加另外一個可以滑動的控件,通常會造成一些莫名其妙的問題。今天主要介紹在工作中遇到的,在ScrollView布局中嵌套Listview顯示不正常,和在Listview中嵌套Listview的滑動沖突的問題。

1.ScrollView布局中嵌套Listview顯示不正常的解決方案

目前來說,解決這個問題有好幾種解決方案,這裡隻介紹其中兩種比較簡單易行的其中兩種。

(1)自定義一個Listview,繼承自Listview,代碼如下:

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class ListViewForScrollView extends ListView {  
  2.     public ListViewForScrollView(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public ListViewForScrollView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public ListViewForScrollView(Context context, AttributeSet attrs,  
  9.             int defStyle) {  
  10.         super(context, attrs, defStyle);  
  11.     }  
  12.     @Override  
  13.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  14.         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
  15.                 MeasureSpec.AT_MOST);  
  16.         super.onMeasure(widthMeasureSpec, expandSpec);  
  17.     }  
  18. }  

在使用的時候,用這個控件代替Listview控件即可。

(2)重新計算Listview的高度

在一個滑動布局中添加一個滑動控件,滑動控件的高度因為不能計算,是以隻能顯示一個Item,若要解決這個問題,我們可以重新計算Listview的高度,調用下面的靜态方法即可。

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1.     public static void setListViewHeightBasedOnChildren(ListView listView) {  
  2.         ListAdapter listAdapter = listView.getAdapter();  
  3.         if (listAdapter == null) {  
  4.             return;  
  5.         }  
  6.         int totalHeight = 0;  
  7.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  8.             View listItem = listAdapter.getView(i, null, listView);  
  9.             listItem.measure(0, 0);  
  10.             totalHeight += listItem.getMeasuredHeight();  
  11.         }  
  12.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  13.         params.height = totalHeight  
  14.                 + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  15.         listView.setLayoutParams(params);  
  16.     }  

2.在Listview中嵌套Listview的滑動沖突問題

之前在項目中,出現了這種需求,就是在一個listview的footer中添加一個小的Listview,但是由于觸摸沖突問題,小的listview不能滑動,若要解決這個問題,我們可以自定義一個控件繼承自listview,然後重寫onInterceptTouchEvent方法,對觸摸事件進行分發。

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,我們可以在這個方法裡面,對子控件或者是父控件擷取觸摸處理權限進行分發,進而完成各自的滑動任務。

效果圖如下

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題

代碼如下

[java]  view plain copy

【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
【Android界面實作】解決ScrollView中嵌套Listview,Listview中嵌套Listview顯示不完整和滑動沖突的問題
  1. public class InnerListview extends ListView {  
  2.     public InnerListview(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public InnerListview(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     public InnerListview(Context context, AttributeSet attrs, int defStyle) {  
  9.         super(context, attrs, defStyle);  
  10.     }  
  11.     @Override  
  12.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  13.         switch (ev.getAction()) {  
  14.         // 當手指觸摸listview時,讓父控件交出ontouch權限,不能滾動  
  15.         case MotionEvent.ACTION_DOWN:  
  16.             setParentScrollAble(false);  
  17.         case MotionEvent.ACTION_MOVE:  
  18.             break;  
  19.         case MotionEvent.ACTION_UP:  
  20.         case MotionEvent.ACTION_CANCEL:  
  21.             // 當手指松開時,讓父控件重新擷取onTouch權限  
  22.             setParentScrollAble(true);  
  23.             break;  
  24.         }  
  25.         return super.onInterceptTouchEvent(ev);  
  26.     }  
  27.     // 設定父控件是否可以擷取到觸摸處理權限  
  28.     private void setParentScrollAble(boolean flag) {  
  29.         getParent().requestDisallowInterceptTouchEvent(!flag);  
  30.     }  
  31. }  

這樣,外面的listview和裡面的小listview就都可以實作各自的滑動了。

    項目位址 https://github.com/ZhaoKaiQiang/InnerListview