让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
代码在这里
最近太忙了。发个福利安慰一下自己
- 让listview在scrollview中自由滑动
- 让listview在scrollview中自由滑动
- 解决ListView在ScrollView中滑动冲突
- listview在scrollview中自行滑动(滑动冲突)
- 解决ListView在ScrollView中滑动冲突的问题
- 解决水平ListView在ScrollView中出现的滑动冲突
- 自定义listview/gridview实现在scrollview中滑动
- 解决ListView嵌套在ScrollView中滑动冲突问题
- 实现水平ListView,并且解决水平ListView在ScrollView中Listview中出现的滑动冲突
- ScrollView 中嵌入ListView 控件 滑动ListView
- 重写ListView、GridView让其在ScrollView中完整显示
- 实现水平listview,而且解决水平listview在scrollview中出现的滑动冲突
- 安卓学习笔记---实现两个ListView或者GridView在Scrollview中同时滑动,实现ScrollView滑动到顶部
- ScrollView中嵌套ListView 滑动冲突
- ScrollView中嵌套ListView滑动问题
- 在ScrollView中嵌套ListView
- 在ScrollView中使用ListView
- 在ScrollView中嵌套ListView
- 单例设计模式之懒汉模式
- Notification桌面提醒:HTML5新功能
- Android系统架构的详细解析——很全面
- 第三周 项目2 建设顺序表算法库
- 剑指Offer面试题34:丑数 Java实现
- 让listview在scrollview中自由滑动
- 中断串口接收方法
- 想微信一样的输入框textview 一次可以输入多行 textView的placeholder提示框
- C语言(4)------基本数据类型之整数数据类型
- 算法 Tricks(四)—— 获取一个数二进制形式第一个不为 0 的位置
- 多线程---数据共享
- spring 集成 Hibernate4.3.X org.hibernate.service.jta.platform.spi.JtaPlatform异常
- HPUX系统备份需要确认的设定
- Scanner的常用方法