引起:java.lang.ClassCastException:android.app.Application无法强制转换为com.xxx

时间:2015-08-11 15:14:31

标签: android listview classcastexception

在浏览了有关该问题的多个问题并尝试了多个问题之后,我最终得出了当前的错误。 基本上,我试图通过单击按钮动态填充列表视图。

为此,我有以下.xml提取:

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/new_exercise_button"
        android:id="@+id/exercise_add"
        android:onClick="addItems"             />
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false" />

我实现了一个用于处理列表的类RoutineListView:

public class RoutineListView extends ListActivity {
    ArrayList<String> listItems=new ArrayList<String>();
    ArrayAdapter<String> adapter;

    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.fragment_main);
        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                listItems);
        setListAdapter(adapter);
    }
    public void addLItems(View v) {
        adapter.add("hi");
    }
}

当我点击主活动中的按钮时,我尝试使用MainActivity中的以下代码调用该方法:

public void addItems(View v){
    RoutineListView routineListView = (RoutineListView)this.getApplicationContext();
    routineListView.addLItems(v);
}

但是,调试器会为getApplicationContext()抛出以下错误 - 如果我没有实现它,我会得到adapter.add()的空例外。

  

引起:java.lang.ClassCastException:android.app.Application无法强制转换为com.mycompany.ownfitnesstracker.RoutineListView

最后,但并非最不重要的是,我在清单中注册了我的RoutineListView

    <activity
        android:name=".RoutineListView"
        android:label="@string/routine_list_name" >
        <intent-filter>
            <action android:name="android.intent.action.GET_CONTENT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

2 个答案:

答案 0 :(得分:0)

RoutineListView是Activity,而不是ApplicationgetApplicationContext()不会返回Activity。你不能以这种方式获得对RoutineListView的引用。

有一些方法可以在活动之间进行通信,但很少涉及从一方到另一方的直接方法调用。大多数情况下,您使用Intent,或者将数据存储在活动之外(例如使用SharedPreferences)。

答案 1 :(得分:0)

您可以在不使用对象的情况下直接呼叫addItems

public void addItems(View v){
    addLItems(v);
}