通过查看统计平台反馈回来的错误报告,发现在android 4.0系统下,Viewpager屡屡报错。原因与Viewpager中包含有自定义Listview有关,而原生的Listview控件不会报错。Viewpager中存放着四个自定义的Listview(下拉刷新),在切换的过程中就会崩溃,如图:
出错位置在PagerAdapter的destroyItem方法中,会报java.lang.IllegalArgumentException:
The observer is null 错误,堆栈信息如下,请仔细看:
java.lang.IllegalArgumentException: The observer is null. at android.database.Observable.unregisterObserver(Observable.java:59) at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42) at android.widget.HeaderViewListAdapter.unregisterDataSetObserver(HeaderViewListAdapter.java:256) at android.widget.AbsListView.onDetachedFromWindow(AbsListView.java:2309) at android.view.View.dispatchDetachedFromWindow(View.java:8197) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1968) at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1966) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3257) at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3237) at android.view.ViewGroup.removeView(ViewGroup.java:3185) at com.aheudev.a.slickdeals.adapters.DealPageAdapter.destroyItem(DealPageAdapter.java:174) at android.support.v4.view.ViewPager.populate(ViewPager.java:415) at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:696) at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:668) ……………………………… ………………………………
而这些错误来源于我们复写的PagerAdapter中的这个方法:
@Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); }
原因是Listview的adapter 中的unregisterDataSetObserver方法被调用了两次,导致observer为空。我们只要复写与Listview绑定的适配器中的unregisterDataSetObserver方法即可,在其中做一个非空判断即可。按如下代码:
@Overridepublic void unregisterDataSetObserver(DataSetObserver observer) { if (observer != null) { super.unregisterDataSetObserver(observer); } }
错误分析:
仔细观察堆栈信息红色部分发现,错误的源头来源于BaseAdapter.unregisterDataSetObserver方法。
经过Log 大概了解到,在滑动过程中viewpager会移除不在视野范围内的View。
如上图,比如移动到第三个tab页,会把第一个tab页中的view移除;移动到第四个tab页会把第二个tab页中的view移除掉。当我们再次移动到第三个tab页时,Viewpager依旧会将第一个tab页中的View移除……
有移除就有添加,本来这没有什么。但是通过Log打印的信息,我发现在android 4.0中,Viewpager除了移除View中的列表组件Listview之外,还同时多做了一件事情,那就是调用列表组件Listview的适配器Adapter的unregisterDataSetObserver方法,移除了与适配器绑定数据集观察者DataSetObserver ,也就是那个observer。但是在4.0以下的系统中,ViewPager没有移除列表组件Listview的数据集观察者observer。
所以当再次移动到第三个tab时,会继续卸载位于第一个位置tab中的listview的观察者 ,这时因为观察者已经被卸载为空,而报非法的参数错误。
让人疑惑的就是4.0下:原生的Listview在移除观察者时,没有任何问题。自定义的Listview在移除观察者时,就会报以上的堆栈信息。如果有哪位大虾知道出现这种不兼容原因,欢迎指教。
参考资料:http://stackoverflow.com/questions/7290841/java-lang-illegalargumentexception-the-observer-is-null
原文链接:http://www.67tgb.com/?p=495
欢迎访问:望月听涛
在drawable中新建一个xml文件
customer.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <color android:color="#d3d8dc"/> </item> <item android:state_pressed="false"> <color android:color="#00000000"/> </item> </selector>
在listview的item中使用此背景图片
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/customer" > <LinearLayout android:id="@+id/textv_no_result_linear" android:layout_width="fill_parent" android:layout_height="@dimen/list_row_height" android:gravity="right|center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/textv_no_result_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="10dp" /> <TextView android:id="@+id/textv_no_result_txt" android:layout_width="fill_parent" android:layout_height="@dimen/list_row_height" android:gravity="center_vertical" android:paddingLeft="10dip" android:textColor="@color/search_no_result_text" android:textSize="@dimen/list_row_textsize_big" /> </LinearLayout> </LinearLayout>
前几天,终于把我们的游戏做好了。我想着把它放在GoogleMarket上挺麻烦,就先把它放在安卓市场上了。有没有大神告诉我具体怎么把这放到google Market上?太感谢了。
我介绍一下这款游戏吧。
1、三种游戏模式
2、经典模式,不断的解锁关卡
3、竞技模式,在60s内尽可能获得最高分数
4、abc模式,单词记忆
5、当前界面分享到新浪人人
ABC模式。
经典模式
竞技模式
感觉游戏做的是挺好的。欢迎大家试玩。如果有需要,我可以公布部分源码给大家,欢迎大家来提提意见。让我把这个贪吃蛇更加完善。
下载地址:http://static.apk.hiapk.com/html/2012/07/720966.html
求推广。求完善。
欢迎交流