为什么我的LoaderManager / CursorLoader组合在ListView中显示数据库查询时无法正常工作?

时间:2012-06-18 06:48:52

标签: android android-listview android-loadermanager android-cursorloader

我一直在这方面工作,一直在努力了解这一切是如何融合在一起的,并重新编写我的代码以便更好地融合在一起。
所以我会告诉你我有什么。没有错误,只是空白。

MyAgendaLoaderManager.java:

public class MyAgendaLoaderManager implements LoaderCallbacks<Cursor>{

MyAgendaAdapter agendaAdapter;
Context mContext;
String date;

public MyAgendaLoaderManager(Context context, MyAgendaAdapter adapter, String date) {
    agendaAdapter = adapter;
    mContext = context;
    this.date = date;
}

@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
    Uri baseUri = SmartCalProvider.CONTENT_URI;
    return new CursorLoader(mContext, baseUri, 
            new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"}, 
            "WHERE date(?) >= start_date and date(?) <= end_date", new String[]{date, date}, null);
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    // TODO Auto-generated method stub
    agendaAdapter.swapCursor(arg1);
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    // TODO Auto-generated method stub
    agendaAdapter.swapCursor(null);
}

}

CalProvider.java:

public class SmartCalProvider extends ContentProvider {
public static final String AUTHORITY = "content://com.smartcal.eventprovider";
public static final Uri CONTENT_URI = Uri.parse(AUTHORITY);

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "cal.db";

private SmartCalOpenHelper openHelper;
private SQLiteDatabase database;

@Override
public boolean onCreate() {
    openHelper = new SmartCalOpenHelper(getContext());
    return true;
}


@Override
public String getType(Uri uri) {
    return null;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    database = openHelper.getWritableDatabase();
    return database.query("events_info", projection, selection, selectionArgs, null, null, null);
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    return null;
}

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
    return 0;
}


@Override
public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
    return 0;
}
}

如果重要的话,那就是在主要活动中运行它的代码:

agendaAdapter = new MyAgendaAdapter(this, null);
MyAgendaLoaderManager loader = new MyAgendaLoaderManager(this, agendaAdapter, getChosenDate());

我只是看不出它是如何空白的。请记住,我故意在CursorLoader和LoaderManager中留下一些空白,因为我不想全部填写以查明是否有错误,所以我只是测试是否显示初始列表,并且它不是。任何帮助弄清楚我做错了什么都会非常感激。

编辑:实际上,现在我考虑过它,除了我的适配器创建持有它的视图之外,没有什么能够将我正在做的事情与特定列表联系起来。但是这种观点不是常规布局的一部分。所以也许这就是我的错误,不幸的是我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

您不应直接实例化加载程序。您需要完成活动getLoaderManager()方法才能正确初始化并启动它。因此,根据您的活动,请根据需要致电getLoaderManager().initLoader()/restartLoader()