使用notifyDataSetChanged在ListView刷新期间在viewHolder中使用NullPointerException

时间:2014-07-31 01:35:39

标签: android android-listview refresh android-arrayadapter notifydatasetchanged

在我的应用下载新数据后,我试图刷新我的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();






    }


     }

这里是片段http://pastebin.com/4cVvJ6QG

的完整代码

1 个答案:

答案 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);
}