0

我不习惯这种适配器,而且我遇到了 CursorAdaptor 的问题。这是我的课程:

public class TicketsAdapter extends CursorAdapter {
    private Cursor cursor;
    private Context context;
    private final LayoutInflater inflater;

    public TicketsAdapter (Context context, Cursor cursor) {
        super(context, cursor, FLAG_REGISTER_CONTENT_OBSERVER);
        this.cursor = cursor;
        this.context = context;
        inflater = LayoutInflater.from(context);
    }

    public void bindView(View view, Context context, Cursor cursor) {
        //cursor.moveToFirst();     I have tried this, same error   
        //try {    I have used this 'try' and find out here's the code where an exception is being throwed
        TextView ticketId = (TextView) view.findViewById(R.id.ticketId);
        TextView ticketCourse = (TextView) view.findViewById(R.id.ticketCourse);
        TextView ticketDate = (TextView) view.findViewById(R.id.ticketDate);
        TextView ticketTime = (TextView) view.findViewById(R.id.ticketTime);
        RelativeLayout row = (RelativeLayout) view.findViewById(R.id.ticketRow);
        TextView jogodaveia = (TextView) view.findViewById(R.id.textView1);

        ticketId.setText(cursor.getString(cursor.getColumnIndex("ticket_id")));
        ticketCourse.setText(cursor.getString(cursor.getColumnIndex("course")));
        ticketDate.setText(cursor.getString(cursor.getColumnIndex("date")));
        ticketTime.setText(cursor.getString(cursor.getColumnIndex("departure")));

        String present = cursor.getString(cursor.getColumnIndex("present"));

        if (present.equals("0")) {
            row.setBackgroundColor(Color.rgb(210, 245, 210));
            jogodaveia.setTextColor(Color.rgb(16, 181, 4));
        } else {
            row.setBackgroundColor(Color.rgb(255, 255, 255));
            jogodaveia.setTextColor(Color.rgb(206, 109, 0));
        }
        //} catch (Exception e) {android.util.Log.w("ADAPTER", e.toString());}
    }

    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        final View view = inflater.inflate(R.layout.ticket,parent,false); 
        return view;
    }
}

在我的 Tickets.java 中,我有:

public class Tickets extends ListActivity {
    private SQLiteDatabase db=null;
    private Cursor cursor=null;
    private ListView layout;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tickets);

        layout = getListView();
        layout.setDividerHeight(3);

        db = (new DatabaseHelper(this)).getWritableDatabase();
        cursor = db.rawQuery("SELECT _id, ticket_id, course, date, departure FROM tickets ORDER BY date",
                                                            null);
        //cursor.moveToFirst();   I have tried this here too
        layout.setAdapter(new TicketsAdapter (Tickets.this, cursor));

    }
    ....
}

我得到的错误是

Failed to read row 0, column -1 from a CursorWindow which has 5 rows, 5 columns.
11-15 00:03:30.700: W/ADAPTER(1756): java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

但是,我的列表仍然显示,但不能正常工作。关于我做错了什么的任何想法?

4

1 回答 1

2
Failed to read row 0, column -1

这意味着找不到您的列之一,行索引很好。


在这里你要求"present"

String present = cursor.getString(cursor.getColumnIndex("present"));

"present"但是您在查询中忘记了:

cursor = db.rawQuery("SELECT _id, ticket_id, course, date, departure FROM tickets ORDER BY date", null);

此外,您应该newView() 一次找到所有视图并将它们存储在 ViewHolder 中。您的列索引也是如此。无需重复搜索相同的信息,这将为您提供更快的应用程序。

于 2012-11-15T00:22:19.193 回答