在我的应用下载新数据后,我试图刷新我的Listview,解析它,并将其添加到listView中显示的数组列表中。这一切都发生在用户下拉刷新时。除非我无法弄清楚如何刷新listView,当我使用notifyDataSetChanged时,它只会在此行抛出一个空指针异常。 如何刷新ListView?
holder.imageView.setImageResource(R.drawable.science);
这是logcat
07-30 21:08:25.588: E/AndroidRuntime(26202): FATAL EXCEPTION: main
07-30 21:08:25.588: E/AndroidRuntime(26202): Process: com.bernard.beaconportal, PID: 26202
07-30 21:08:25.588: E/AndroidRuntime(26202): java.lang.NullPointerException
07-30 21:08:25.588: E/AndroidRuntime(26202): at com.bernard.beaconportal.Due_Today_Fragment$Due_TodayAdapter.getView(Due_Today_Fragment.java:753)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.AbsListView.obtainView(AbsListView.java:2343)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.ListView.makeAndAddView(ListView.java:1812)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.ListView.fillDown(ListView.java:698)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.ListView.fillSpecific(ListView.java:1359)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.ListView.layoutChildren(ListView.java:1623)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.AbsListView.onLayout(AbsListView.java:2186)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:343)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1594)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1160)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:801)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.View.layout(View.java:15143)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewGroup.layout(ViewGroup.java:4862)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2323)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2029)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.Choreographer.doCallbacks(Choreographer.java:591)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.Choreographer.doFrame(Choreographer.java:560)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.os.Handler.handleCallback(Handler.java:808)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.os.Handler.dispatchMessage(Handler.java:103)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.os.Looper.loop(Looper.java:193)
07-30 21:08:25.588: E/AndroidRuntime(26202): at android.app.ActivityThread.main(ActivityThread.java:5299)
07-30 21:08:25.588: E/AndroidRuntime(26202): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 21:08:25.588: E/AndroidRuntime(26202): at java.lang.reflect.Method.invoke(Method.java:515)
07-30 21:08:25.588: E/AndroidRuntime(26202): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
07-30 21:08:25.588: E/AndroidRuntime(26202): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
07-30 21:08:25.588: E/AndroidRuntime(26202): at dalvik.system.NativeStart.main(Native Method)
这是数组适配器,以及我用来填充listView
的方法private void populateListView() {
adapter = new Due_TodayAdapter();
ListView list = (ListView)getView().findViewById(R.id.listView1);
list.setAdapter(adapter);
}
public class Due_TodayAdapter extends ArrayAdapter<Due_Today_List> {
public Due_TodayAdapter() {
super(getActivity(), R.layout.item_view, due_today_list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
convertView = getActivity().getLayoutInflater().inflate(R.layout.item_view, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView)convertView.findViewById(R.id.item_iconclass);
holder.HomeworkDueText = (TextView) convertView.findViewById(R.id.item_texthomeworkdue);
holder.DescriptionText = (TextView) convertView.findViewById(R.id.item_textdescription);
holder.TeacherText = (TextView) convertView.findViewById(R.id.item_textteacher);
holder.TypeText = (TextView) convertView.findViewById(R.id.item_texttype);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
Due_Today_List currenthomeworkdue = due_today_list.get(position);
if(currenthomeworkdue.getType() != null && !currenthomeworkdue.getType().isEmpty()){
Teacher = currenthomeworkdue.getTeacher().substring(0,1).toUpperCase()+currenthomeworkdue.getTeacher().substring(1).toLowerCase();
//Description = currenthomeworkdue.getDescription().substring(5);
Description = currenthomeworkdue.getDescription().toString();
Description = StringUtils.trim(Description);
if(currenthomeworkdue.Band.substring(0, Math.min(currenthomeworkdue.Band.length(), 1)).equals("S")){
holder.imageView.setImageResource(R.drawable.science);
}
if(currenthomeworkdue.Band.substring(0, Math.min(currenthomeworkdue.Band.length(), 1)).equals("M")){
holder.imageView.setImageResource(R.drawable.mathematics);
}
if(currenthomeworkdue.Band.substring(0, Math.min(currenthomeworkdue.Band.length(), 1)).equals("H")){
holder.imageView.setImageResource(R.drawable.global_studies);
}
if(currenthomeworkdue.Band.substring(0, Math.min(currenthomeworkdue.Band.length(), 2)).equals("FS")){
holder.imageView.setImageResource(R.drawable.spanish);
}
if(currenthomeworkdue.Band.substring(0, Math.min(currenthomeworkdue.Band.length(), 1)).equals("E")){
holder.imageView.setImageResource(R.drawable.english);
}
holder.HomeworkDueText.setText(currenthomeworkdue.getTitle().trim());
holder.DescriptionText.setText(Description);
holder.DescriptionText.setEllipsize(TruncateAt.END);
holder.TeacherText.setText(Teacher.trim());
holder.TypeText.setText(currenthomeworkdue.getType().trim());
return convertView;
} else {
View empty = getActivity().getLayoutInflater().inflate(R.layout.empty_item, parent, false);
return empty;
}
}
此外,Asynctask用于更新ListView,notifyDataSetChanged位于AsyncTask的末尾,在Post Execute中。
public class Update extends AsyncTask<String, Void, Void> {
private final HttpClient Client = new DefaultHttpClient();
@Override
protected Void doInBackground(String... urls) {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.beaconschool.org/~markovic/lincoln.php");
HttpResponse response = httpClient.execute(httpGet, localContext);
String result = "";
try {
Log.d("receiver", "animation stopped and downloaded file");
String duetoday_html = new Scanner(response.getEntity().getContent(), "UTF-8" ).useDelimiter("\\A").next();
String duetoday = Html.fromHtml(duetoday_html).toString();
SharedPreferences.Editor localEditor = getActivity().getSharedPreferences("due_today", Context.MODE_PRIVATE ).edit();
localEditor.putString("duetoday_content", duetoday);
localEditor.apply();
Log.d("receiver", "information given to shared preferences");
parse_due_today_string();
parse_due_today_content();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
swipeLayout.setRefreshing(false);
adapter.notifyDataSetChanged();
Toast.makeText(getActivity(),"Refresh Finished",4000).show();
}
}
的完整代码
答案 0 :(得分:1)
你没有确切地发布哪一行崩溃,但根据你的getView实现,在你的代码中的某个点上是一个不错的选择,返回没有应用持有者的通用视图的其他情况正在被击中:
View empty = getActivity().getLayoutInflater().inflate(R.layout.empty_item, parent, false);
return empty;
在这个区块中,没有ViewHolder,所以如果这个视图被回收(它会在某个时候),上面的代码将持有者拉出来:
else {
holder = (ViewHolder) convertView.getTag();
}
会导致持有人为空。
通常我会尝试通过为所有视图返回相同的视图来解决getView(如果可能),并根据数据显示和隐藏子视图。
if(convertView==null){
convertView = getActivity().getLayoutInflater().inflate(R.layout.item_view, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView)convertView.findViewById(R.id.item_iconclass);
holder.HomeworkDueText = (TextView) convertView.findViewById(R.id.item_texthomeworkdue);
holder.DescriptionText = (TextView) convertView.findViewById(R.id.item_textdescription);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
然后
if (data == null) {
//hide your views here, or show some generic "empty" text
holder.DescriptionText.setVisibilty(View.GONE);
}