尽管有这个问题的标题,但其内容却截然不同。
在我的Activity
中,我想用GridView
和ListView
来表示数据。我创建了两个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 android.widget.AbsListView.obtainView(AbsListView.java:2240)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.widget.ListView.makeAndAddView(ListView.java:1790)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.widget.ListView.fillSpecific(ListView.java:1337)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.widget.ListView.layoutChildren(ListView.java:1608)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4202)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.view.Choreographer.doFrame(Choreographer.java:543)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.os.Handler.handleCallback(Handler.java:733)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.os.Handler.dispatchMessage(Handler.java:95)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.os.Looper.loop(Looper.java:136)
02-21 11:01:12.216: E/AndroidRuntime(7587): at android.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.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
02-21 11:01:12.216: E/AndroidRuntime(7587): at com.android.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
无效并使其无形,为什么会发生这种情况?
答案 0 :(得分:0)
我找到了解决方案。
在每个onClick
个案例中,我添加了一行来将旧Adapter
的{{1}}设置为null。这会中断旧View
上的待处理操作。
View
答案 1 :(得分:-1)
一个好的解耦和简单的解决方案是在适配器内重用您的数据而不是适配器本身。为GridView和ListView创建2个适配器,但为这两个适配器重复使用相同的DataSource。这样,您可以在以后更改任何视图的UI,而无需使用其他视图更改任何内容。