自定义适配器的上下文参数 - getApplicationContext()失败但是'这个'作品

时间:2014-09-18 22:25:07

标签: android android-listview android-arrayadapter baseadapter android-context

我有简单的代码段来实现自定义列表视图。

在此代码中,我有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上下文的场景是什么?

[注意:我已经阅读了一些答案herehere,但这里没有涉及具体问题。所有人都说'你可以使用它们中的任何一个',但在这样的特定情况下,它不起作用。所以,请不要标记为重复。]

2 个答案:

答案 0 :(得分:2)

您应该在创建适配器对象时传递活动的上下文。应用程序上下文与活动上下文不同,它们永远不应互换。使用应用程序上下文为您提供应用程序的整个上下文,具体取决于您设置应用程序子类的方式。虽然它仍然可以编译,但它可能会产生您不期望的结果。崩溃的原因是因为您的Application子类已经进入了什么,并且可能特定于您的情况。

简单地说,适配器对象应该使用本地的Activity上下文,因为这是它绑定的那个。

答案 1 :(得分:1)

在初始化期间,适配器永远不应该获得Application上下文。正如链接codeMagic所提到的,如果它与Activity的生命直接相关,那么你应该总是将Activity传递给一个类对象。

现在,它确实可以为ArrayAdapter提供应用程序上下文。它不会崩溃或抛出错误。然而,它会做的是以不同的方式呈现您的观点。主要是因为应用程序上下文缺少主题,您可能已经或可能没有为您的应用程序和/或特定于给定活动提供主题。

至于崩溃发生的原因?某些事情特别错误的代码。我的猜测是,您将mcontext定义为Activity,因此它在自定义构造函数中崩溃...或者它被定义为Context但在某处作为活动使用导致崩溃的背景。