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'