android 4.0.x listview的一个空指针问题

这里我使用了PinnedSectionListView这个控件,该控件用于模仿IOS的UITableView的section悬停在顶部的效果。

在android 4.0.x机型上,该控件引发空指针错误。

首先贴出错误log:

E/AndroidRuntime(18435): java.lang.NullPointerException

E/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么?

接下来要规避该问题了:

@Override
public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值