比较自定义Adapter类中的日期(Null Pointer Exception)?

时间:2013-11-16 22:43:28

标签: android android-custom-view custom-adapter android-date

我有一个自定义适配器。我尝试比较当前日期和输入日期。 但是我有空指针异常。我无法弄清楚为什么这个例外的原因。 我的LogCat在下面,问题在于“((ViewGroup)todoView).getChildAt(i).setBackgroundColor(0x01060018); “有人能帮助我吗?

我的适配器类;

public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { 

    private int resource; 
    Context context;
    ArrayList<ToDoItem> todoItem;

    public ToDoItemAdapter(Context context, int resource, ArrayList<ToDoItem> objects) { 

        super(context, resource, objects); // TODO Auto-generated constructor stub 
        this.resource = resource;
        this.context = context;
        this.todoItem = objects;
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        // TODO Auto-generated method stub 

        LinearLayout todoView; 
        ToDoItem todo = getItem(position); 
        String priorityString = todo.getPriority(); 
        String taskString = todo.getTask(); 
        String dateString = todo.getDeadline(); 
        String statusString = todo.getStatus();

        if (convertView == null) 
        { 
            todoView = new LinearLayout(getContext()); 
            String inflater = Context.LAYOUT_INFLATER_SERVICE; 
            LayoutInflater li; 
            li = (LayoutInflater)getContext().getSystemService(inflater); 
            li.inflate(resource, todoView, true); 
        } 
        else 
        { 
            todoView = (LinearLayout) convertView; 

            int len = todoItem.size();

            for(int i = 0; i < len; i++)
            {
                String deadline = todoItem.get(i).getDeadline();
                String status = todoItem.get(i).getStatus();
                String currentDate =  findCurrentDate();
                SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
                java.util.Date data=null;
                try {
                    data = sdf.parse(deadline);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                java.util.Date current =null;
                try {
                    current = sdf.parse(currentDate);
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();

                    System.out.println(data);

                }
                if(status.equals("DONE"))
                {
                    ((ViewGroup) todoView).getChildAt(i).setBackgroundColor(0xff00ff00);
                    System.out.println(data);
                }
                else
                {
                    System.out.println(data);
                    if(data.compareTo(current)>0 || data.compareTo(current)==0){
                        ((ViewGroup) todoView).getChildAt(i).setBackgroundColor(0x01060018);
                    }else if(data.compareTo(current)<0){
                        ((ViewGroup) todoView).getChildAt(i).setBackgroundColor(0x01060016);
                    }
                }
            }
        } 

        TextView priorityView = (TextView) todoView.findViewById(R.id.itemPriority); 
        TextView taskView = (TextView) todoView.findViewById(R.id.itemTask); 
        TextView dateView = (TextView) todoView.findViewById(R.id.itemDeadline); 
        TextView statusView = (TextView) todoView.findViewById(R.id.itemStatus);

        priorityView.setText(priorityString); 
        taskView.setText(taskString); 
        dateView.setText(dateString); 
        statusView.setText(statusString);
        return todoView; 

    } 

    private String findCurrentDate() {
        // TODO Auto-generated method stub
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        String date = day+"-"+(month+1)+"-"+year;
        return date;
          }
}

logcat的

11-16 17:32:12.357: E/AndroidRuntime(3148): FATAL EXCEPTION: main
11-16 17:32:12.357: E/AndroidRuntime(3148): java.lang.NullPointerException
11-16 17:32:12.357: E/AndroidRuntime(3148):     at com.example.enhancedtodolistapplication.ToDoItemAdapter.getView(ToDoItemAdapter.java:107)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.AbsListView.obtainView(AbsListView.java:2161)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.ListView.onMeasure(ListView.java:1159)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.View.measure(View.java:15848)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.View.measure(View.java:15848)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.View.measure(View.java:15848)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.View.measure(View.java:15848)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.View.measure(View.java:15848)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.Choreographer.doFrame(Choreographer.java:532)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.os.Handler.handleCallback(Handler.java:730)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.os.Looper.loop(Looper.java:137)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at android.app.ActivityThread.main(ActivityThread.java:5103)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at java.lang.reflect.Method.invokeNative(Native Method)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at java.lang.reflect.Method.invoke(Method.java:525)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-16 17:32:12.357: E/AndroidRuntime(3148):     at dalvik.system.NativeStart.main(Native Method)

输出(两个不同项目的日期)

11-16 18:44:30.687: I/System.out(4087): variable deadline 15-10-2012
11-16 18:44:30.697: I/System.out(4087): variable currentDate 16-11-2013
11-16 18:44:30.717: I/System.out(4087): variable data Mon Oct 15 00:00:00 EDT 2012
11-16 18:44:30.727: I/System.out(4087): variable current Sat Nov 16 00:00:00 EST 2013
11-16 18:44:30.757: I/System.out(4087): variable deadline 17-12-2014
11-16 18:44:30.757: I/System.out(4087): variable currentDate 16-11-2013
11-16 18:44:30.767: I/System.out(4087): variable data Wed Dec 17 00:00:00 EST 2014
11-16 18:44:30.777: I/System.out(4087): variable current Sat Nov 16 00:00:00 EST 2013

1 个答案:

答案 0 :(得分:0)

看起来您没有正确初始化(convertView == null)案例的新布局。

你做

 li.inflate(resource, todoView, true); 

请注意“膨胀”的结果是膨胀的视图。中间参数将成为父级 - 通常这是某种ViewGroup或ListView。无论如何,它是getView()的“父”参数。

然后,稍后,您尝试查找todoView的子视图。但它是空的,所以这些调用将返回null。后续引用将会出错。

这是一种更简单的扩充方式:

 LayoutInflater inflater = context.getLayoutInflater();
 todoView = (LinearLayout) inflater.inflate (resource, parent, false);