NullPointerException在单独的Asynctask类中获取listview的适配器

时间:2015-08-27 23:43:14

标签: android android-listview android-asynctask

经过一些研究和代码尝试后,我仍然从尝试从我的片段列表视图中获取ArrayAdapter而得到NullPointerException。我有一个滑动标签布局,我试图将Tab2的列表视图传递到我的AsyncTask(AsyncTask是它自己的文件)。

登录:

08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at com.example.android.justdoit.IncProgressTask.onPostExecute(IncProgressTask.java:408)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at com.example.android.justdoit.IncProgressTask.onPostExecute(IncProgressTask.java:31)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:632)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at android.os.Looper.loop(Looper.java:145)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5942)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
08-27 16:17:28.752    2980-2980/com.example.android.justdoit W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

在这个片段中,我让Tab1调用AsyncTask并传入Tab2的布局。

//My tab2view is declared as follows in my fragment's onCreateView
//tab2view = inflater.inflate(R.layout.tab2, container, false);
@Override
    public void onClick(View v) {
        switch(v.getId()){
            case(R.id.quick_pushup_button):
                new IncProgressTask(getActivity(), tab2view).execute(1, 12);
                break;
            case(R.id.quick_squat_button):
                new IncProgressTask(getActivity(), tab2view).execute(2, 12);
                break;
            case(R.id.quick_plank_button):
                new IncProgressTask(getActivity(), tab2view).execute(3, 12);
                break;
            case(R.id.quick_situp_button):
                new IncProgressTask(getActivity(), tab2view).execute(4, 12);
                break;
        }
    }

在我的AsyncTask的onPostExecute中,这是我尝试使用tab2view获取Tab2 listview,它的适配器,以及调用notifyDataSetChanged:

public IncProgressTask(Context context, View rootView){
    this.context = context;
    this.rootView = rootView;
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    ListView list = (ListView) rootView.findViewById(R.id.questList);
    try {
        ArrayAdapter adapter = (ArrayAdapter)list.getAdapter();
        adapter.notifyDataSetChanged();
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

对于为什么会发生这种情况的任何见解都将非常感激。

编辑:

我在Tab2中设置了适配器。它位于onStart()方法中。

以下代码段:

adapter = new ArrayAdapter<Quest>(getActivity(), android.R.layout.simple_list_item_activated_1, questLog);
        ListView listView = (ListView) getActivity().findViewById(R.id.questList);
        listView.setAdapter(adapter);

1 个答案:

答案 0 :(得分:0)

在onStart()方法中,您正在初始化listView,如右图所示 -

ListView listView = (ListView) getActivity().findViewById(R.id.questList);
    listView.setAdapter(adapter);

记住你正在使它成为一个本地的变种。你不能在其他地方使用它,并且你在这个方法中附加了你的arrayAdapter。

我建议你做这样的事。

使listView成为全局变量,因此一旦初始化,您可以在任何地方使用它。 kiek this -

在类之上声明ListView而不是在任何方法之间。

ListView listView;

然后在onStart()方法内部初始化它。

listView=(ListView)v.findViewById(R.id.listView)//whatever;
listview.setAdpater(aa);

一旦完成。您可以在任何地方使用此列表视图。无需再次初始化它。

我希望这会对你有所帮助。