在数据库发生变化时停止刷新 listView

Stop refreshing listView on change in Database

我正在使用 cursorLoader 创建 ListView。如果数据库发生任何变化,我不想刷新我的列表数据或重新启动加载程序。有什么解决办法吗?

这是我从数据库加载数据的方式。

@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);

因为 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);
        }
    };
}

这将 return 一个没有通知 uri 的游标,因此当数据库更改时它不会收到通知