android 4.0.x listview的一个空指针问题
来源:互联网 发布:怎么用js生成表格 编辑:程序博客网 时间:2024/06/18 07:49
这里我使用了PinnedSectionListView这个控件,该控件用于模仿IOS的UITableView的section悬停在顶部的效果。
在android 4.0.x机型上,该控件引发空指针错误。
首先贴出错误log:
E/AndroidRuntime(18435): java.lang.NullPointerExceptionE/AndroidRuntime(18435): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:472)E/AndroidRuntime(18435): at android.view.View.measure(View.java:12816)E/AndroidRuntime(18435): at com.handmark.pulltorefresh.library.PinnedSectionListView.createPinnedShadow(PinnedSectionListView.java:216)E/AndroidRuntime(18435): at com.handmark.pulltorefresh.library.PinnedSectionListView.ensureShadowForPosition(PinnedSectionListView.java:251)E/AndroidRuntime(18435): at com.handmark.pulltorefresh.library.PinnedSectionListView$1.onScroll(PinnedSectionListView.java:117)E/AndroidRuntime(18435): at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1321)E/AndroidRuntime(18435): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4934)E/AndroidRuntime(18435): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:2949)E/AndroidRuntime(18435): at android.widget.AbsListView.startScrollIfNeeded(AbsListView.java:2894)E/AndroidRuntime(18435): at android.widget.AbsListView.onInterceptTouchEvent(AbsListView.java:3770)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1639)E/AndroidRuntime(18435): at com.handmark.pulltorefresh.library.PinnedSectionListView.dispatchTouchEvent(PinnedSectionListView.java:467)E/AndroidRuntime(18435): at com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListView.dispatchTouchEvent(PullToRefreshListView.java:306)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1940)E/AndroidRuntime(18435): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1392)E/AndroidRuntime(18435): at android.app.Activity.dispatchTouchEvent(Activity.java:2387)E/AndroidRuntime(18435): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1888)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1754)E/AndroidRuntime(18435): at android.view.ViewGroup.dispatchTransforme
第一反应是适配出了问题,后来发现情况并非如此,因为在android 其他版本上运行正常,而手中的两部android 4.0.x的手机均出现该问题。
按照bug所指位置,定位了下空指针位置的代码:
if (isWrapContentHeight) { // Height already has top padding in it since it was calculated by looking at // the bottom of each child view height += mPaddingBottom; if (mLayoutParams.height >= 0) {<span style="color:#ff0000;">//空指针所在line</span> height = Math.max(height, mLayoutParams.height); }。。。。以上代码是android 4.0.4_r1的代码,可见是mLayoutParams空指针导致
那么为什么Android其他版本没有该问题呢?接下来我查看了下android 4.4.2该位置的代码:
if (isWrapContentHeight) { // Height already has top padding in it since it was calculated by looking at // the bottom of each child view height += mPaddingBottom; if (<span style="color:#ff0000;">mLayoutParams != null</span> && mLayoutParams.height >= 0) { height = Math.max(height, mLayoutParams.height); }好吧,原来是Android工程师在后续版本修复了该问题,so……我可以理解为这是个Android系统原生bug么?
接下来要规避该问题了:
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {<span style="white-space:pre"></span><span style="white-space:pre"></span>MainListViewHolder viewHolder;<span style="white-space:pre"></span><span style="white-space:pre"></span>if(convertView==null){<span style="white-space:pre"></span>viewHolder = new MainListViewHolder();<span style="white-space:pre"></span>convertView = LayoutInflater.from(con).inflate(R.layout.analyse_new_row, null,false);<span style="white-space:pre"></span><span style="color:#ff0000;"><span style="white-space:pre"></span>convertView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT<span style="white-space:pre"></span>, AbsListView.LayoutParams.WRAP_CONTENT));</span><span style="white-space:pre"></span>。。。。。。既然Listview在measure其成员时出现layoutparam为null,那么我们就在adapter的getview方法中为生成的list成员添加一个layoutparam。
OK,问题解决。
0 0
- android 4.0.x listview的一个空指针问题
- 一个空指针问题
- 解决一个冷门的空指针问题
- listView.removeFooterView(View)报空指针的奇异问题
- ListView绑定适配器空指针问题发生的原因
- 关于listView.setAdapter(adapter)报空指针异常的问题
- ListView.setAdapter(adapter);空指针异常的问题
- 【Android】自定义ListView的Adapter报空指针异常解决方法
- Android--关于Cursor空指针的问题
- 【Android】AndroidStudio空指针解决之:listview与adapter的使用报空 java.lang.NullPointerException
- Android 控件 空指针问题
- Android 中Listview方法getChildAt()返回为空的问题
- 自定义listview的ArrayAdapter报空指针
- QQ手机管家android版本的一个空指针bug
- 实现一个分组的ListView但是以滚动就会出现空指针的异常
- ListView空指针
- android ndk空指针导致CRASH的问题
- 关于Android setOnclicklistener抛出空指针的问题
- uva 11524 InCircle 内切圆(计算几何)
- 对vector等STL标准容器进行排序操作
- 正则表达式学习
- 详细解析如何做一款成功的APP应用
- 71 独木舟上的旅行
- android 4.0.x listview的一个空指针问题
- IPSEC_AUTO(8) - 控制IPsec连接
- 修改不能重复!
- Unity3D默认函数的执行顺序
- tomcat 命令
- SQL Server FOR XML PATH 语句的应用
- 72 Financial Management
- GCD入门详解
- HDU 4333 Revolving Digits 扩展KMP