在数据库中更改时停止刷新listView

时间:2015-02-02 13:35:14

标签: android listview android-cursorloader

我正在使用 ListView 创建 cursorLoader 。如果在Database中发生任何更改,我不想刷新列表数据或重新启动加载器。有没有解决方案?

以下是我从数据库加载数据的方法。

@Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {

        String SELECTION = MyContactsQuery.SELECTION ;
            return new CursorLoader(SelectContactsForGroup.this, MyContactsProvider.CONTENT_URI, MyContactsQuery.PROJECTION,SELECTION, null, MyContactsQuery.SORT_ORDER);

    }

    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
        if(arg1.getCount() <= 0){
            invitelist.setFastScrollAlwaysVisible(false);
        }else{
            invitelist.post(fitsOnScreen);
        }

        if(!isfromRestartLoader){
            arg1.moveToFirst();
            while(arg1.moveToNext()){
                checkedStates.put(arg1.getString(arg1.getColumnIndex(MyContactsConstants.CONTACT_JID)), false);
            }
            arg1.moveToFirst();
        }
        madapter.swapCursor(arg1);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
        if (arg0.getId() == MyContactsQuery.QUERY_ID){
            madapter.swapCursor(null);
        }
    }

在我的onCreate方法中:

getLoaderManager().initLoader(MyContactsQuery.QUERY_ID, null, (LoaderCallbacks<Cursor>) this);

1 个答案:

答案 0 :(得分:1)

由于CursorLoarder在uri上注册ContentObserver,您可以使用Loader的其他实现

@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {

    String SELECTION = MyContactsQuery.SELECTION ;
    return new AsyncTaskLoader<Cursor>(SelectContactsForGroup.this) {

        @Override
        public Cursor loadInBackground() {
            return getContentResolver().query(MyContactsProvider.CONTENT_URI, 
                                              MyContactsQuery.PROJECTION, 
                                              SELECTION, 
                                              null, 
                                              MyContactsQuery.SORT_ORDER);
        }
    };
}

这将返回一个没有通知uri的游标,因此当db更改时它将不会被通知