项目中遇到一个奇怪的问题:为Gallery设置的adapter中的getView方法被调用多次
客户需求:一次只能滑动一格
参考资料:
Android Adapter multiple getView
android listview中getView重复被调用的问题
getView被调用的次数取决于当前屏幕能显示的item的数量,显示一个item就调用一次。当listview的layout_height属性是wrap_content时,有可能造成listview无法计算高度,相应的需要显示的item数量就无法计算,造成getView多次被调用。
解决方案:
1:
在listview外面套一层
RelativeLayout
,将listview高度设置为
fill_parent
。
<span style="color: rgb(78, 78, 78);"><span class="tag" style="color: rgb(0, 0, 136);"><</span></span><span class="tag" style="color: rgb(0, 0, 136);">RelativeLayout</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(78, 78, 78);"><span class="atn" style="color: rgb(102, 0, 102);">xmlns:android</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"http://schemas.android.com/apk/res/android"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:id</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"@+id/RelativeLayout1"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_width</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"match_parent"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_height</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"match_parent"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:orientation</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"vertical"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:background</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"@drawable/repeat_bg"</span><span class="tag" style="color: rgb(0, 0, 136);">></span></span> <p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; line-height: 22px;"><span style="color: rgb(78, 78, 78);"><br style="line-height: 25px;" /><span class="pln" style="line-height: 25px; color: rgb(0, 0, 0);"> </span></span><span style="line-height: 25px; color: rgb(78, 78, 78);"><span class="tag" style="color: rgb(0, 0, 136);"><ListView</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="color: rgb(78, 78, 78);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:id</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"@+id/friend_list"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_width</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"fill_parent"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_height</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"</span></span><span style="line-height: 22px;"><span style="color: rgb(255, 0, 0); line-height: 25px;"><span class="atv" style="color: rgb(0, 136, 0);">fill_parent</span></span></span><span style="color: rgb(78, 78, 78);"><span class="atv" style="color: rgb(0, 136, 0);">"</span></span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="color: rgb(78, 78, 78);"><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_weight</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"1"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:cacheColorHint</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"#00000000"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:divider</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"#CCCCCC"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:fastScrollEnabled</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"true"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:focusableInTouchMode</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"true"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);">/></span> </span></p><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span style="color: rgb(78, 78, 78);"><span class="tag" style="color: rgb(0, 0, 136);"></</span></span><span class="tag" style="color: rgb(0, 0, 136);">RelativeLayout</span><span style="color: rgb(78, 78, 78);"><span class="tag" style="color: rgb(0, 0, 136);">></span></span></p>
2:
在listview外面套一层
LinearLayout
,将listview高度设置为
0dip
。
<p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"><span class="tag" style="color: rgb(0, 0, 136);"><LinearLayout</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">xmlns:android</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"http://schemas.android.com/apk/res/android"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_width</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"fill_parent"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_height</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"fill_parent"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:background</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"#f3f3f3"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:orientation</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"vertical"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);">></span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);"><ListView</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:id</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"@+id/requestObjLV"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_width</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"fill_parent"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_height</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"</span><span style="color: rgb(255, 0, 0);"><span class="atv" style="color: rgb(0, 136, 0);">0dip</span></span><span class="atv" style="color: rgb(0, 136, 0);">"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:layout_weight</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"1"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:cacheColorHint</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"#00000000"</span> <span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(102, 0, 102);">android:divider</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(0, 136, 0);">"</span><span style="line-height: 22px; color: rgb(78, 78, 78);"><span class="atv" style="line-height: 25px; color: rgb(0, 136, 0);">#CCCCCC</span></span><span class="atv" style="color: rgb(0, 136, 0);">"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);">/></span> <span class="tag" style="color: rgb(0, 0, 136);"></LinearLayout></span></p>
当ListView\GridView设置固定大小,就不会多次调用了~