0

我正在尝试用一组Appointment对象填充列表视图“日记”。打开活动时,我得到一个运行时异常:java.util.NoSuchElementException. 我一直在绞尽脑汁想弄清楚这可能是如何发生的,但是由于我的 android 经验相当有限,我完全被难住了……

我的活动代码在这里:

    DiaryAdapter dAdapter;
    DateTime currentDate;
    ListView diary;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Show the Up button in the action bar.
        setupActionBar();
        setContentView(R.layout.activity_diary);
        diary = (ListView) findViewById(R.id.lstAppts);

        currentDate = new DateTime();
        populateDiaryNew(currentDate);
    }

    private void populateDiaryNew(DateTime dt) {
        currentDate = dt;
        ArrayList<Appointment> appointments = new ArrayList<Appointment>();
        Cursor cursor = Db.Functions.getAppointmentList(dt);
        if (cursor == null)
            return;
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            Appointment appt = Db.Functions.getAppointment(cursor.getString(cursor.getColumnIndex("_id")));
            appointments.add(appt);
            cursor.moveToNext();
        }
        cursor.close();

        ListIterator<Appointment> iter = appointments.listIterator();
        DateTime lastEndTime = new DateTime();
        int count = 0;
        while (iter.hasNext()){
            lastEndTime = iter.next().endDateTime;

            if (count > 0)
            {
                if (iter.next().startDateTime.isAfter(lastEndTime))
                {
                    Appointment freeAppt = new Appointment();
                    freeAppt.isFreeTime = true;
                    freeAppt.subject = "Free slot";
                    freeAppt.startDateTime = lastEndTime;
                    freeAppt.endDateTime = iter.next().startDateTime;
                    appointments.add(freeAppt);
                }
            }
            count++;
        }
        DiaryAdapter adapter = new DiaryAdapter(this, R.layout.appointment_info, appointments);
        //ArrayAdapter<Appointment> arrayAdapter = new ArrayAdapter<Appointment>(this, R.layout.appointment_info, R.id.lblSubject, appointments);
        diary.setAdapter(adapter);      
    }

我的自定义适配器代码(DiaryAdapter)如下:

public class DiaryAdapter extends ArrayAdapter {

    ArrayList<Appointment> appointments;

    public DiaryAdapter(Context context, int resource, ArrayList<Appointment> appts) {
        super(context, resource, appts);
        this.appointments = appts;
    }  

    static class ViewHolder {
        TextView v1;
        TextView v2;
        TextView v3;
        TextView v4;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Appointment temp = getItem(position);
        ViewHolder viewHolder;

        if (convertView == null) { //inflate convertView and populate viewHolder
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.appointment_info, parent, false);
            viewHolder.v1= (TextView) convertView.findViewById(R.id.lblTime);
            viewHolder.v2= (TextView) convertView.findViewById(R.id.lblSubject);
            viewHolder.v3= (TextView) convertView.findViewById(R.id.lblLocation);
            viewHolder.v4= (TextView) convertView.findViewById(R.id.lblCustomer);
            convertView.setTag(viewHolder); //set the tag
        }
        else {
            viewHolder = (ViewHolder) convertView.getTag(); //re-use the ViewHolder to     save calls to findViewById
        }
        viewHolder.v1.setText(temp.startDateTime.toString("hh:mm"));
        viewHolder.v2.setText(temp.subject);
        viewHolder.v3.setText(Db.Functions.getLocation(temp.locationId.toString()));
        viewHolder.v4.setText(Db.Functions.getCustomerName(temp.customerId.toString()));
        return convertView;
    }

    @Override
    public Appointment getItem(int position) {
        return appointments.get(position);
    }
}  

列表项的 XML 布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/lblTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignBaseline="@+id/lblSubject"
        android:layout_alignBottom="@+id/lblSubject"
        android:paddingTop="16dp"
        android:paddingLeft="16dp"
        android:text="Time"
        android:textSize="16dp"
        android:textColor="#FFFFFF" />

    <TextView
        android:id="@+id/lblSubject"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Subject"
        android:textSize="20dp"
        android:paddingTop="16dp"
        android:paddingRight="16dp"
        android:textColor="#FFFFFF" /> 

    <TextView
        android:id="@+id/lblLocation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/lblCustomer"
        android:layout_alignBottom="@+id/lblCustomer"
        android:layout_alignParentLeft="true"
        android:text="Location"
        android:paddingBottom="15dp"
        android:paddingLeft="16dp"
        android:textColor="#FFFFFF"
        android:textSize="16dp" />  

    <TextView
        android:id="@+id/lblCustomer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@id/lblSubject"
        android:text="Customer"
        android:paddingBottom="15dp"
        android:paddingRight="16dp"
        android:textSize="16dp"
        android:textColor="#FFFFFF" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/lblLocation"
        android:background="#333333" />

</RelativeLayout>

最后这是我的 logcat 异常:

08-30 16:13:29.268: E/AndroidRuntime(9917): FATAL EXCEPTION: main
08-30 16:13:29.268: E/AndroidRuntime(9917): java.lang.RuntimeException: Unable to start 

activity ComponentInfo{com.example.myapp/com.example.myapp.DiaryActivity}: 

java.util.NoSuchElementException
08-30 16:13:29.268: E/AndroidRuntime(9917):     at 

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at 

android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at android.app.ActivityThread.access$700

(ActivityThread.java:140)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at android.app.ActivityThread

$H.handleMessage(ActivityThread.java:1237)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at android.os.Handler.dispatchMessage

(Handler.java:99)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at android.os.Looper.loop(Looper.java:137)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at android.app.ActivityThread.main

(ActivityThread.java:4921)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at java.lang.reflect.Method.invokeNative

(Native Method)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at java.lang.reflect.Method.invoke

(Method.java:511)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at com.android.internal.os.ZygoteInit

$MethodAndArgsCaller.run(ZygoteInit.java:1027)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at com.android.internal.os.ZygoteInit.main

(ZygoteInit.java:794)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at dalvik.system.NativeStart.main(Native 

Method)
08-30 16:13:29.268: E/AndroidRuntime(9917): Caused by: java.util.NoSuchElementException
08-30 16:13:29.268: E/AndroidRuntime(9917):     at java.util.AbstractList

$SimpleListIterator.next(AbstractList.java:59)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at 

com.example.myapp.DiaryActivity.populateDiaryNew(DiaryActivity.java:71)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at 

com.example.myapp.DiaryActivity.onCreate(DiaryActivity.java:46)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at android.app.Activity.performCreate

(Activity.java:5206)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at 

android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
08-30 16:13:29.268: E/AndroidRuntime(9917):     at 

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
08-30 16:13:29.268: E/AndroidRuntime(9917):     ... 11 more

所以我只是想弄清楚为什么我会得到这个例外。我已经学习了一些关于如何为列表视图制作自定义数据适配器的教程,据我所知,我已经正确地完成了。我一定错过了什么,但我不确定是什么。

很抱歉发布这样的问题,但我是 android 新手,完全被难住了。任何帮助深表感谢!

4

1 回答 1

2

我认为问题的一个可能的地方是,下面的代码:

iter.next()多次调用,但iter.hasNext()只检查一次。

while (iter.hasNext()){
            lastEndTime = iter.next().endDateTime;

            if (count > 0)
            {
                if (iter.next().startDateTime.isAfter(lastEndTime))

             ............................
于 2013-08-30T15:35:28.843 回答