让listview在scrollview中自由滑动

来源:互联网 发布:淘宝c店全屏装修 编辑:程序博客网 时间:2024/05/18 03:40

总有人我listview嵌套scrollview怎么弄。一问就是半天,太耗时,所以写个博客也算是自己总结一下。

目标

  • scrollview嵌套listview,可以自由的定义listview的大小,而不是展示全部listview。

  • 让listview在scrollview中自由滑动。

  • 当listview滑动到顶端或底端的时候,让scrollview开始滑动

直接上图看效果好了:
这里写图片描述

代码也很简单 直接上代码

<code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span><span class="hljs-tag"><<span class="hljs-title">ScrollView</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>    <span class="hljs-attribute">xmlns:tools</span>=<span class="hljs-value">"http://schemas.android.com/tools"</span>    <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>    <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>    <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"@color/colorPrimary"</span>    <span class="hljs-attribute">android:paddingBottom</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>    <span class="hljs-attribute">android:paddingLeft</span>=<span class="hljs-value">"@dimen/activity_horizontal_margin"</span>    <span class="hljs-attribute">android:paddingRight</span>=<span class="hljs-value">"@dimen/activity_horizontal_margin"</span>    <span class="hljs-attribute">android:paddingTop</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>    <span class="hljs-attribute">tools:context</span>=<span class="hljs-value">"wang.com.scrollholdlistview.MainActivity"</span>></span>    <span class="hljs-tag"><<span class="hljs-title">LinearLayout</span>        <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>        <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>        <span class="hljs-attribute">android:orientation</span>=<span class="hljs-value">"vertical"</span>></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">wang.com.scrollholdlistview.MyListView</span>            <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/lv"</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"400dp"</span>            <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"@color/colorAccent"</span>></span><span class="hljs-tag"></<span class="hljs-title">wang.com.scrollholdlistview.MyListView</span>></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">TextView</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:layout_margin</span>=<span class="hljs-value">"@dimen/activity_vertical_margin"</span>            <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"Hello World!"</span>            <span class="hljs-attribute">android:textSize</span>=<span class="hljs-value">"30sp"</span> /></span>        <span class="hljs-tag"><<span class="hljs-title">wang.com.scrollholdlistview.MyListView</span>            <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/lv1"</span>            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>            <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"@color/colorAccent"</span>></span>        <span class="hljs-tag"></<span class="hljs-title">wang.com.scrollholdlistview.MyListView</span>></span>    <span class="hljs-tag"></<span class="hljs-title">LinearLayout</span>></span><span class="hljs-tag"></<span class="hljs-title">ScrollView</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>
<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> wang.com.scrollholdlistview;<span class="hljs-keyword">import</span> android.content.Context;<span class="hljs-keyword">import</span> android.util.AttributeSet;<span class="hljs-keyword">import</span> android.util.Log;<span class="hljs-keyword">import</span> android.view.MotionEvent;<span class="hljs-keyword">import</span> android.widget.ListView;<span class="hljs-javadoc">/** * 创建日期: 16/4/3 下午9:55 * 作者:wanghao * 描述: */</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyListView</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ListView</span> {</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG = <span class="hljs-string">"MyListView"</span>;    <span class="hljs-keyword">public</span> <span class="hljs-title">MyListView</span>(Context context) {        <span class="hljs-keyword">this</span>(context, <span class="hljs-keyword">null</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-title">MyListView</span>(Context context, AttributeSet attrs) {        <span class="hljs-keyword">this</span>(context, attrs, <span class="hljs-number">0</span>);    }    <span class="hljs-keyword">public</span> <span class="hljs-title">MyListView</span>(Context context, AttributeSet attrs, <span class="hljs-keyword">int</span> defStyleAttr) {        <span class="hljs-keyword">super</span>(context, attrs, defStyleAttr);    }    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onMeasure</span>(<span class="hljs-keyword">int</span> widthMeasureSpec, <span class="hljs-keyword">int</span> heightMeasureSpec) {        <span class="hljs-keyword">int</span> defaultsize=measureHight(Integer.MAX_VALUE >> <span class="hljs-number">2</span>, heightMeasureSpec);        <span class="hljs-keyword">int</span> expandSpec = MeasureSpec.makeMeasureSpec(defaultsize, MeasureSpec.AT_MOST);        <span class="hljs-keyword">super</span>.onMeasure(widthMeasureSpec, expandSpec);    }    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> <span class="hljs-title">measureHight</span>(<span class="hljs-keyword">int</span> size, <span class="hljs-keyword">int</span> measureSpec) {        <span class="hljs-keyword">int</span> result = <span class="hljs-number">0</span>;        <span class="hljs-keyword">int</span> specMode = MeasureSpec.getMode(measureSpec);        <span class="hljs-keyword">int</span> specSize = MeasureSpec.getSize(measureSpec);        <span class="hljs-keyword">if</span> (specMode == MeasureSpec.EXACTLY) {            Log.i(TAG, <span class="hljs-string">"exactly"</span> );            result = specSize;        } <span class="hljs-keyword">else</span> {            result = size;<span class="hljs-comment">//最小值是200px ,自己设定</span>            <span class="hljs-keyword">if</span> (specMode == MeasureSpec.AT_MOST) {                result = Math.min(result, specSize);            }            Log.i(TAG, <span class="hljs-string">"specMode:"</span>+specMode+<span class="hljs-string">"--result:"</span>+result );        }        <span class="hljs-keyword">return</span> result;    }    <span class="hljs-javadoc">/**     * 改listview滑到底端了     *     *<span class="hljs-javadoctag"> @return</span>     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isBottom</span>() {        <span class="hljs-keyword">int</span> firstVisibleItem = getFirstVisiblePosition();<span class="hljs-comment">//屏幕上显示的第一条是list中的第几条</span>        <span class="hljs-keyword">int</span> childcount = getChildCount();<span class="hljs-comment">//屏幕上显示多少条item</span>        <span class="hljs-keyword">int</span> totalItemCount = getCount();<span class="hljs-comment">//一共有多少条</span>        <span class="hljs-keyword">if</span> ((firstVisibleItem + childcount) >=totalItemCount) {            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;        }        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;    }    <span class="hljs-javadoc">/**     * 改listview在顶端     *     *<span class="hljs-javadoctag"> @return</span>     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isTop</span>() {        <span class="hljs-keyword">int</span> firstVisibleItem = getFirstVisiblePosition();        <span class="hljs-keyword">if</span> (firstVisibleItem ==<span class="hljs-number">0</span>) {            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;        }        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;    }    <span class="hljs-keyword">float</span> down = <span class="hljs-number">0</span>;    <span class="hljs-keyword">float</span> y;    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">dispatchTouchEvent</span>(MotionEvent event) {        <span class="hljs-keyword">switch</span> (event.getAction()) {            <span class="hljs-keyword">case</span> MotionEvent.ACTION_DOWN:                down = event.getRawY();                getParent().requestDisallowInterceptTouchEvent(<span class="hljs-keyword">true</span>);                <span class="hljs-keyword">break</span>;            <span class="hljs-keyword">case</span> MotionEvent.ACTION_MOVE:                y = event.getRawY();                <span class="hljs-keyword">if</span> (isTop()) {                    <span class="hljs-keyword">if</span> (y - down > <span class="hljs-number">1</span>) {<span class="hljs-comment">//                        到顶端,向下滑动 把事件教给父类</span>                        getParent().requestDisallowInterceptTouchEvent(<span class="hljs-keyword">false</span>);                    } <span class="hljs-keyword">else</span> {                        <span class="hljs-comment">//                        到顶端,向上滑动 把事件拦截 由自己处理</span>                        getParent().requestDisallowInterceptTouchEvent(<span class="hljs-keyword">true</span>);                    }                }                <span class="hljs-keyword">if</span> (isBottom()) {                    <span class="hljs-keyword">if</span> (y - down > <span class="hljs-number">1</span>) {<span class="hljs-comment">//                        到底端,向下滑动 把事件拦截 由自己处理</span>                        getParent().requestDisallowInterceptTouchEvent(<span class="hljs-keyword">true</span>);                    } <span class="hljs-keyword">else</span> {<span class="hljs-comment">//                        到底端,向上滑动 把事件教给父类</span>                        getParent().requestDisallowInterceptTouchEvent(<span class="hljs-keyword">false</span>);                    }                }                <span class="hljs-keyword">break</span>;            <span class="hljs-keyword">default</span>:                <span class="hljs-keyword">break</span>;        }        <span class="hljs-keyword">return</span> <span class="hljs-keyword">super</span>.dispatchTouchEvent(event);    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

上面代码直接用就可以啦。
那么下面说下好多人遇到过的疑惑

  • 为什么这么写就能避免嵌套问题呢
    下面代码是网上流传最多的
<code class="hljs java has-numbering"><span class="hljs-annotation">@Override</span><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onMeasure</span>(<span class="hljs-keyword">int</span> widthMeasureSpec, <span class="hljs-keyword">int</span> heightMeasureSpec) {<span class="hljs-keyword">int</span> expandSpec = MeasureSpec.makeMeasureSpec(            Integer.MAX_VALUE >> <span class="hljs-number">2</span>, MeasureSpec.AT_MOST);    <span class="hljs-keyword">super</span>.onMeasure(widthMeasureSpec, expandSpec);}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

这样写呢有个弊端,就是 在scrollview里面展示了 listview的全部内容。有100条就显示了100条。
Integer.MAX_VALUE >> 2这个呢就是一个值。让你的listview最大值是多大。你可以写成65535,或者其他数值。为什么用 MeasureSpec.AT_MOST呢?
看下super里面

<code class="hljs java has-numbering"><span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onMeasure</span>(<span class="hljs-keyword">int</span> widthMeasureSpec, <span class="hljs-keyword">int</span> heightMeasureSpec) {        <span class="hljs-comment">// Sets up mListPadding</span>        <span class="hljs-keyword">super</span>.onMeasure(widthMeasureSpec, heightMeasureSpec);        <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> widthMode = MeasureSpec.getMode(widthMeasureSpec);        <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> heightMode = MeasureSpec.getMode(heightMeasureSpec);        <span class="hljs-keyword">int</span> widthSize = MeasureSpec.getSize(widthMeasureSpec);        <span class="hljs-keyword">int</span> heightSize = MeasureSpec.getSize(heightMeasureSpec);       ...        <span class="hljs-keyword">if</span> (heightMode == MeasureSpec.AT_MOST) {            <span class="hljs-comment">// TODO: after first layout we should maybe start at the first visible position, not 0</span>            heightSize = measureHeightOfChildren(widthMeasureSpec, <span class="hljs-number">0</span>, NO_POSITION, heightSize, -<span class="hljs-number">1</span>);        }        setMeasuredDimension(widthSize, heightSize);        mWidthMeasureSpec = widthMeasureSpec;    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

再看下measureHeightOfChildren()的内容

<code class="hljs java has-numbering"><span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> measureHeightOfChildren(<span class="hljs-keyword">int</span> widthMeasureSpec, <span class="hljs-keyword">int</span> startPosition, <span class="hljs-keyword">int</span> endPosition,            <span class="hljs-keyword">int</span> maxHeight, <span class="hljs-keyword">int</span> disallowPartialChildPosition) {        <span class="hljs-keyword">final</span> ListAdapter adapter = mAdapter;        <span class="hljs-keyword">if</span> (adapter == <span class="hljs-keyword">null</span>) {            <span class="hljs-keyword">return</span> mListPadding.top + mListPadding.bottom;        }        <span class="hljs-comment">// Include the padding of the list</span>        <span class="hljs-keyword">int</span> returnedHeight = mListPadding.top + mListPadding.bottom;        <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> dividerHeight = ((mDividerHeight > <span class="hljs-number">0</span>) && mDivider != <span class="hljs-keyword">null</span>) ? mDividerHeight : <span class="hljs-number">0</span>;        <span class="hljs-comment">// The previous height value that was less than maxHeight and contained</span>        <span class="hljs-comment">// no partial children</span>        <span class="hljs-keyword">int</span> prevHeightWithoutPartialChild = <span class="hljs-number">0</span>;        <span class="hljs-keyword">int</span> i;        View child;        <span class="hljs-comment">// mItemCount - 1 since endPosition parameter is inclusive</span>        endPosition = (endPosition == NO_POSITION) ? adapter.getCount() - <span class="hljs-number">1</span> : endPosition;<span class="hljs-comment">//获取有多少个item</span>        <span class="hljs-keyword">final</span> AbsListView.RecycleBin recycleBin = mRecycler;        <span class="hljs-keyword">final</span> <span class="hljs-keyword">boolean</span> recyle = recycleOnMeasure();        <span class="hljs-keyword">final</span> <span class="hljs-keyword">boolean</span>[] isScrap = mIsScrap;<span class="hljs-comment">//遍历所有item并且 获取到 所有item的整体高度</span>        <span class="hljs-keyword">for</span> (i = startPosition; i <= endPosition; ++i) {            child = obtainView(i, isScrap);            measureScrapChild(child, i, widthMeasureSpec, maxHeight);            <span class="hljs-keyword">if</span> (i > <span class="hljs-number">0</span>) {                <span class="hljs-comment">// Count the divider for all but one child</span>                returnedHeight += dividerHeight;            }            <span class="hljs-comment">// Recycle the view before we possibly return from the method</span>            <span class="hljs-keyword">if</span> (recyle && recycleBin.shouldRecycleViewType(                    ((LayoutParams) child.getLayoutParams()).viewType)) {                recycleBin.addScrapView(child, -<span class="hljs-number">1</span>);            }            returnedHeight += child.getMeasuredHeight();<span class="hljs-comment">//如果item的高度大于咱们赋值的高度也就是Integer.MAX_VALUE >> 2 </span>            <span class="hljs-keyword">if</span> (returnedHeight >= maxHeight) {                <span class="hljs-comment">// We went over, figure out which height to return.  If returnedHeight > maxHeight,</span>                <span class="hljs-comment">// then the i'th position did not fit completely.</span>                <span class="hljs-keyword">return</span> (disallowPartialChildPosition >= <span class="hljs-number">0</span>) <span class="hljs-comment">// Disallowing is enabled (> -1)</span>                            && (i > disallowPartialChildPosition) <span class="hljs-comment">// We've past the min pos</span>                            && (prevHeightWithoutPartialChild > <span class="hljs-number">0</span>) <span class="hljs-comment">// We have a prev height</span>                            && (returnedHeight != maxHeight) <span class="hljs-comment">// i'th child did not fit completely</span>                        ? prevHeightWithoutPartialChild 如果是大于就用自己item整体的高度作为listview的高度                        : maxHeight; 如果是等于那么久用 我们赋值的高度            }<span class="hljs-comment">//如果item的高度 不大于等于 默认值 那么久显示他自己的高度了 </span>            <span class="hljs-keyword">if</span> ((disallowPartialChildPosition >= <span class="hljs-number">0</span>) && (i >= disallowPartialChildPosition)) {                prevHeightWithoutPartialChild = returnedHeight;            }        }        <span class="hljs-comment">// At this point, we went through the range of children, and they each</span>        <span class="hljs-comment">// completely fit, so return the returnedHeight</span>        <span class="hljs-keyword">return</span> returnedHeight;    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

所以我们赋值的Integer.MAX_VALUE >> 2只是一个参考值,你想写多少就是多少。
但是那样写有个弊端就是在xml里面写的高度 就没用了。所以我们就这么写了

<code class="hljs java has-numbering">  <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onMeasure</span>(<span class="hljs-keyword">int</span> widthMeasureSpec, <span class="hljs-keyword">int</span> heightMeasureSpec) {        <span class="hljs-keyword">int</span> defaultsize=measureHight(Integer.MAX_VALUE >> <span class="hljs-number">2</span>, heightMeasureSpec);        <span class="hljs-keyword">int</span> expandSpec = MeasureSpec.makeMeasureSpec(defaultsize, MeasureSpec.AT_MOST);        <span class="hljs-keyword">super</span>.onMeasure(widthMeasureSpec, expandSpec);    }    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> <span class="hljs-title">measureHight</span>(<span class="hljs-keyword">int</span> size, <span class="hljs-keyword">int</span> measureSpec) {        <span class="hljs-keyword">int</span> result = <span class="hljs-number">0</span>;        <span class="hljs-keyword">int</span> specMode = MeasureSpec.getMode(measureSpec);        <span class="hljs-keyword">int</span> specSize = MeasureSpec.getSize(measureSpec);        <span class="hljs-keyword">if</span> (specMode == MeasureSpec.EXACTLY) {            Log.i(TAG, <span class="hljs-string">"exactly"</span> );            result = specSize;        } <span class="hljs-keyword">else</span> {            result = size;<span class="hljs-comment">//最小值是200px ,自己设定</span>            <span class="hljs-keyword">if</span> (specMode == MeasureSpec.AT_MOST) {                result = Math.min(result, specSize);            }            Log.i(TAG, <span class="hljs-string">"specMode:"</span>+specMode+<span class="hljs-string">"--result:"</span>+result );        }        <span class="hljs-keyword">return</span> result;    }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

这样的话就是如果 xml里面是wrap_content的话 就显示所有item的高度。如果是设置了 高度值 比如是400dp。那么listview显示的高度就是400dp。
为什么那么些 请戳这尼自定义view,viewgroup的onMeasure 方法

那么问题又来了。
如果显示400dp的高度。listview就没法全部显示了。
所以就不能让scrollview拦截事件,要让该事件传递到listview,并且处理。 一行代码就搞定

<code class="hljs bash has-numbering">  getParent().requestDisallowInterceptTouchEvent(<span class="hljs-literal">true</span>);  <span class="hljs-literal">true</span>:就是拦截此事件  <span class="hljs-literal">false</span>:不拦截此事件,让父类处理</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

剩下的就只是当listview滑动到顶端和底端 listview就拦截该事件了。代码里已经体现的很简单了。
尊重原创:http://blog.csdn.net/wanghao200906/article/details/51084975
代码在这里

最近太忙了。发个福利安慰一下自己
这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 qq回执编号忘了怎么办 电脑开机要用户名和密码怎么办 电脑忘记用户名和密码怎么办 微信账号密码忘了怎么办 开发者账号密保忘记怎么办 华为账号忘记密保问题怎么办 fiyme账号忘记密保怎么办 id忘了密保问题怎么办 vivo账号密码忘记了怎么办 步步高账号密码忘了怎么办 步步高手机账号密码忘了怎么办 康佳电视通行证忘了怎么办 尚游通行证忘了怎么办 深圳免限行通行证忘了截图怎么办 电脑把管理员账号删除了怎么办 uc新浪加载失败怎么办红包还 微信忘记账号和密码怎么办 苹果手机忘记id密码怎么办 购买游戏账号被找回怎么办 交易猫账号忘了怎么办 爱奇艺账号怎么修改不了密码怎么办 论文目录显示错误未定义书签怎么办 银行账号被冻结了怎么办 哈罗单车账号被冻结怎么办 麻袋赚赚账号被冻结怎么办 网赌账号被冻结怎么办 梦想城镇账号被冻结怎么办 钱被银行冻结了怎么办 百度云账号密码忘了怎么办 微信钱包忘记密码了怎么办 word文档打开文件出错怎么办 有盘文件删不了怎么办 u盘文档严重损坏怎么办 wps文档打开是乱码怎么办 九游3083网资金冻结怎么办 阴阳师九游版禁止部分玩法怎么办 夜神模拟器游戏打不开怎么办 九游代金券锁定怎么办 被娱乐天地骗了怎么办 win8更新失败无法开机怎么办 安装英雄联盟文件损坏怎么办