NullPointerException 在单独的 Asynctask 类中获取列表视图的适配器

Posted

技术标签:

【中文标题】NullPointerException 在单独的 Asynctask 类中获取列表视图的适配器【英文标题】:NullPointerException getting a listview's adapter in a separate Asynctask class 【发布时间】:2015-11-22 12:45:24 【问题描述】:

经过一些研究和代码尝试后,我仍然因为尝试从我的片段列表视图中获取 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)

在这个 sn-p 中,我让 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 列表视图及其适配器并调用 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);

【问题讨论】:

我认为是因为在实例化 IncProgressTask 之前适配器没有设置为 listview,所以 rootview 中的 listview 没有适配器。 我认为在初始化 tab2View 之后调用 AsyncTask 会好得多.. tab2View 在调用 AsyncTask 之前被初始化。它在 onCreateView 中初始化。然后AsyncTask在我做onClick事件后被调用,所以任务肯定是事后调用 【参考方案1】:

在 onStart() 方法中,您正在像这样初始化您的 listView-

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

请记住,您正在将其设为本地变量。您不能在其他地方使用它,并且您将 arrayAdapter 附加到此方法中。

我会建议你做这样的事情。

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

在类的顶部声明 ListView,而不是在任何方法之间。

ListView listView;

然后在 onStart() 方法里面对其进行初始化。

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

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

希望对你有帮助。

【讨论】:

以上是关于NullPointerException 在单独的 Asynctask 类中获取列表视图的适配器的主要内容,如果未能解决你的问题,请参考以下文章

删除 Kafka StateStore 中的记录不起作用(在 .delete(key) 上抛出 NullPointerException)

SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结

NullPointerException,是啥导致我的错误?

在 Apple 的 VerifyReceipt 上不断收到 21002 'java.lang.NullPointerException'

NullPointerException 没有堆栈

在 Java 中避免 NullPointerException