有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

滚动时引发NullPointerException的java ListView

尽管这个问题的标题不同,但内容却大不相同

在我的Activity中,我想用GridViewListView来表示数据。我创建了两个Button,单击时隐藏其中一个View并显示另一个:

//onClick
//switch(view.getId())
case R.id.itemselect_button_grid:
    if (lv.getVisibility() == View.VISIBLE) {
        lv.invalidate();
        lv.setVisibility(View.GONE);
        gv.setVisibility(View.VISIBLE);
        mAdapter.setIsListView(false);
        mAdapter.notifyDataSetChanged();
        gv.setAdapter(mAdapter);
    }
    break;
case R.id.itemselect_button_list:
    if (gv.getVisibility() == View.VISIBLE) {
        gv.invalidate();
        gv.setVisibility(View.GONE);
        lv.setVisibility(View.VISIBLE);
        mAdapter.setIsListView(true);
        mAdapter.notifyDataSetChanged();
        lv.setAdapter(mAdapter);
    }
    break;

我使用相同的Adapter来处理这些项目。我设置了一个boolean标志(setIsListview),根据父View,它基本上以两种不同的方式表示数据

public View getView(final int position, View v, ViewGroup parent) {
    if (v == null) {
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        if (!isListView)
            v = inflater.inflate(layId, parent, false);
        else
            v = inflater.inflate(R.layout.item_list_layout, parent,
                    false);
    }
    Item entry = Entries.getItems().get(position);
    if (!isListView) {
        NetworkImageView image = (NetworkImageView) v
                .findViewById(R.id.item_cover);
        //Line 70 is the following, image is null.
        image.setImageDrawable(mContext.getResources().getDrawable(
                Items.notFoundDrawables.get(categoryItem)));
        image.measure(
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        image.setScaleType(ScaleType.FIT_XY);
        image.getLayoutParams().width = image.getMeasuredWidth();
        image.getLayoutParams().height = image.getMeasuredHeight();
        image.setDefaultImageResId(GamesomePlatforms.notFoundDrawables.get(platform));
        image.setErrorImageResId(GamesomePlatforms.notFoundDrawables.get(platform));
        if (null != entry.getCoverURL()) {
            image.setImageUrl(entry.getCoverURL(), mImageLoader);
        }
    }
    TextView itemTitle = (TextView) v.findViewById(R.id.item_title);
    itemTitle.setText(entry.getTitle());
    return v;
}

logcat错误:

02-21 11:01:12.216: E/AndroidRuntime(7587): FATAL EXCEPTION: main
02-21 11:01:12.216: E/AndroidRuntime(7587): Process: com.vektor.gamesome, PID: 7587
02-21 11:01:12.216: E/AndroidRuntime(7587): java.lang.NullPointerException
02-21 11:01:12.216: E/AndroidRuntime(7587):     at com.vektor.myapp.domain.adapters.MyListAdapter.getView(MyListAdapter.java:70)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.widget.AbsListView.obtainView(AbsListView.java:2240)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.widget.ListView.makeAndAddView(ListView.java:1790)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.widget.ListView.fillSpecific(ListView.java:1337)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.widget.ListView.layoutChildren(ListView.java:1608)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.widget.AbsListView$FlingRunnable.run(AbsListView.java:4202)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.view.Choreographer.doCallbacks(Choreographer.java:574)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.view.Choreographer.doFrame(Choreographer.java:543)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.os.Handler.handleCallback(Handler.java:733)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.os.Handler.dispatchMessage(Handler.java:95)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.os.Looper.loop(Looper.java:136)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at 安卓.app.ActivityThread.main(ActivityThread.java:5081)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at java.lang.reflect.Method.invokeNative(Native Method)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at java.lang.reflect.Method.invoke(Method.java:515)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-21 11:01:12.216: E/AndroidRuntime(7587):     at dalvik.system.NativeStart.main(Native Method)

当我滚动GridView并单击将其转换为ListView时,什么也不会发生,但是如果我滚动ListView并单击将其转换为GridView,应用程序会抛出一个NullPointerException,说明image为空。如果我已经使ListView无效并使其不可见,为什么会发生这种情况


共 (2) 个答案

  1. # 1 楼答案

    一个好的解耦且简单的解决方案是在适配器内重用数据,而不是适配器本身。为GridView和ListView制作两个适配器,但对这两个适配器重复使用相同的数据源。通过这种方式,您可以在将来更改任何视图的UI,而无需更改其他视图的任何内容

  2. # 2 楼答案

    我找到了解决办法

    在每种onClick情况下,我都添加了一行代码,将旧ViewAdapter设置为null。这会中断旧View上挂起的操作

    case R.id.items_button_grid:
        if (lv.getVisibility() == View.VISIBLE) {
            lv.invalidate();
            lv.setAdapter(null);
            lv.setVisibility(View.GONE);
            mAdapter.setIsListView(false);
            mAdapter.notifyDataSetChanged();
            gv.setVisibility(View.VISIBLE);
            gv.setAdapter(mAdapter);
        }
        break;
    case R.id.items_button_list:
        if (gv.getVisibility() == View.VISIBLE) {
            gv.invalidate();
            gv.setAdapter(null);
            gv.setVisibility(View.GONE);
            mAdapter.setIsListView(true);
            mAdapter.notifyDataSetChanged();
            lv.setVisibility(View.VISIBLE);
            lv.setAdapter(mAdapter);
        }
        break;