我有简单的代码段来实现自定义列表视图。
在此代码中,我有CustomAdapter
类扩展ArrayAdapter
:
CustomAdapter adapter = new CustomerAdapter(getApplicationContext(),R.layout.listview_item_row, weather_data);
CustomAdapter
的构造函数如下:
public CustomerAdapter(Context context, int layoutResourceId, weather[] data) {
super(context, layoutResourceId, data);
mlayoutResourceId = layoutResourceId;
mcontext = context;
mdata = data;
}
如果我写这个,logcat会显示以下错误:
Java.lang.ClassCastException: android.app.Application context can not be cast to android.app.Activity
所以我将getApplicationContext()
更改为this
。它工作得很好:
CustomAdapter adapter = new CustomerAdapter(this,R.layout.listview_item_row, weather_data);
所以,我的问题是: 1。为什么我们无法在此处传递应用程序上下文? (对于惯用者)。和
2。我们必须传递Activity上下文而不是Application上下文的场景是什么?
[注意:我已经阅读了一些答案here和here,但这里没有涉及具体问题。所有人都说'你可以使用它们中的任何一个',但在这样的特定情况下,它不起作用。所以,请不要标记为重复。]
答案 0 :(得分:2)
您应该在创建适配器对象时传递活动的上下文。应用程序上下文与活动上下文不同,它们永远不应互换。使用应用程序上下文为您提供应用程序的整个上下文,具体取决于您设置应用程序子类的方式。虽然它仍然可以编译,但它可能会产生您不期望的结果。崩溃的原因是因为您的Application子类已经进入了什么,并且可能特定于您的情况。
简单地说,适配器对象应该使用本地的Activity上下文,因为这是它绑定的那个。
答案 1 :(得分:1)
在初始化期间,适配器永远不应该获得Application
上下文。正如链接codeMagic所提到的,如果它与Activity
的生命直接相关,那么你应该总是将Activity
传递给一个类对象。
现在,它确实可以为ArrayAdapter
提供应用程序上下文。它不会崩溃或抛出错误。然而,它会做的是以不同的方式呈现您的观点。主要是因为应用程序上下文缺少主题,您可能已经或可能没有为您的应用程序和/或特定于给定活动提供主题。
至于崩溃发生的原因?某些事情特别错误的代码。我的猜测是,您将mcontext
定义为Activity
,因此它在自定义构造函数中崩溃...或者它被定义为Context
但在某处作为活动使用导致崩溃的背景。