经过一些研究和代码尝试后,我仍然从尝试从我的片段列表视图中获取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);
答案 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);
一旦完成。您可以在任何地方使用此列表视图。无需再次初始化它。
我希望这会对你有所帮助。