【问题标题】:Crash in ListView at AbsListView.obtainView for ListActivityListView 在 AbsListView.obtainView 中为 ListActivity 崩溃
【发布时间】:2010-02-21 22:21:59
【问题描述】:

我正在使用 ContentObserver 在 ListActivity 上观看内容更新,如下所示:

protected void onCreate(Bundle savedState)
   {
        super.onCreate(savedState);

        ContentResolver cr = getContentResolver();

        Cursor cursor = cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null);
        startManagingCursor(cursor);

        this.mAdapter = new TrackHeaderDataAdapter(this, R.layout.track_list_item, cursor, sTrackListProjection, null);
        setListAdapter(mAdapter);

        Handler handler = new Handler();

        mTrackHeaderObserver = new ContentObserver(handler) {

             @Override 
             public boolean deliverSelfNotifications() { 
                 return false;
             }

             @Override
             public void onChange(boolean selfChange) {
                 super.onChange(selfChange);
                 ContentResolver cr = getContentResolver();
                 mAdapter.changeCursor(cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null));
              }
         };

      getContentResolver().registerContentObserver (TrackHeader.CONTENT_URI, true, mTrackHeaderObserver);
  }

这个内容观察器似乎没问题——它在 UI 线程上被回调,但我在底层 ListView 上得到了以下随机崩溃,这是可以预见的:

02-21 14:06:00.440: ERROR/AndroidRuntime(739): java.lang.NullPointerException
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at  android.widget.AbsListView.obtainView(AbsListView.java:1276)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.makeAndAddView(ListView.java:1668)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.fillDown(ListView.java:637)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.fillSpecific(ListView.java:1224)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.ListView.layoutChildren(ListView.java:1499)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.os.Looper.loop(Looper.java:123)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at android.app.ActivityThread.main(ActivityThread.java:4363)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at java.lang.reflect.Method.invoke(Method.java:521)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-21 14:06:00.440: ERROR/AndroidRuntime(739):     at dalvik.system.NativeStart.main(Native Method)
02-21 14:09:56.159: ERROR/AndroidRuntime(749): ERROR: thread attach failed
02-21 14:09:59.480: ERROR/AndroidRuntime(760): ERROR: thread attach failed
02-21 14:12:19.449: ERROR/AndroidRuntime(778): ERROR: thread attach failed
02-21 14:12:22.779: ERROR/AndroidRuntime(789): ERROR: thread attach failed
02-21 14:12:26.479: ERROR/gralloc(51): [unregister] handle 0x3f13b8 still locked (state=40000001)

以前有人见过这样的东西——被这个东西难倒了好几天......

提姆

【问题讨论】:

  • 嘿,蒂姆,你解决了这个问题吗?我在日志中看到相同的消息
  • 如果你使用getview方法要非常小心,因为Cursoradaptor也有一个叫getview的方法..我在这里烧了几个小时..
  • @SaKet 顺便说一句,你的解决方案是什么?

标签: android listview


【解决方案1】:

我有一个类似的堆栈跟踪,发现在某些情况下我从我的 getView() 方法返回 null。

【讨论】:

  • 我遇到了同样的问题,这就是正在发生的事情。我忘记在我的适配器的 getView 中删除 null 返回。
  • 和我一样。我被覆盖的 ExpandableListAdapter 底部的一个杂散“返回 null”导致了这种情况。
  • 让我头疼不已……诅咒那些被淘汰的方法!
  • 我完全忘了实现我的适配器!
  • 嗨,我知道这个帖子很旧,但这是给任何可能找到这个帖子的人的。我一直看到这个错误,代码中的一切似乎都正常;直到我注意到幕后也发生了其他一些小例外。 apk 格式不正确。愚蠢,非常烦人,但是一旦我用“make”而不是“mm”做了一个干净的apk构建,一切都神奇地消失了。 HTH。
【解决方案2】:

如果您有一个列表并扩展 BaseAdapter 或 Adapter 以获取自定义列表,请确保 getView 返回非空值。

如果您有一个选项卡式视图,并且您的片段之一是覆盖 Adapter/BaseAdapter 并且 getView 返回 null 的列表,您将遇到此问题。

【讨论】:

  • 非常感谢@Skywalker
【解决方案3】:

如果您使用静态类 ViewHolder 将视图项存储在适配器中,您可能忘记将 viewHolder 对象设置为 convertView 的标记。例如:

if (convertView == null) {
    LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.adapter_drivers_and_riders, null);
        holder = new ViewHolder();
        holder.tvDate = (TextView)convertView.findViewById(R.id.tvDate);
        holder.tvTime = (TextView)convertView.findViewById(R.id.tvTime);

        convertView.setTag(holder);

} else {
    holder = (ViewHolder) convertView.getTag();
}

在我的情况下,我没有使用游标,但遇到了同样的问题,我发现我忘记将标签设置为 viewHolder 到 convertView 所以当为列表视图创建第一个适配器视图时,没关系,但是当您滚动和回收机制工作时,它会崩溃,因为它无法从 convertView 恢复 viewHolder。

以防万一,我想提一下。

【讨论】:

  • 非常感谢...它帮助了我,我没有设置标签,所以它产生了异常。 convertView.setTag(holder);它解决了:)
【解决方案4】:

我没有用过changeCursor()。而且,由于您用于创建 Cursor 的查询与您用于“更改”光标的查询相同,因此我将直接转储 changeCursor() 调用并在 Cursor 上调用 requery()你有。

【讨论】:

  • 是的,实际上,我从 requery() 开始并遇到了同样的问题。还有其他想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
相关资源
最近更新 更多