ContentObserver onChange()未被调用。

时间:2014-07-10 10:38:45

标签: android android-contentprovider contentobserver

我有ContentProvider。我的内容提供商中的update方法是:

       @Override
   public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
      int count = 0;
      switch (uriMatcher.match(uri)){
      case CONTACT:
         count = db.update(CONTACTS_TABLE_NAME, values, 
                 selection, selectionArgs);
         break;
      case CONTACT_ID:
         count = db.update(CONTACTS_TABLE_NAME, values, _ID + 
                 " = " + uri.getPathSegments().get(1) + 
                 (!TextUtils.isEmpty(selection) ? " AND (" +
                 selection + ')' : ""), selectionArgs);
         break;
      default: 
         throw new IllegalArgumentException("Unknown URI " + uri );
      }
      getContext().getContentResolver().notifyChange(uri, null);
      return count;
   }

然后我正在实施ContentObserver。 的 MYContentObserver

@SuppressLint("NewApi")
    public class MyObserver extends ContentObserver {        
        public MyObserver(Handler handler) {
            super(handler);            
        }
        @Override
        public void onChange(boolean selfChange) {
            List<Contact> newData;
            if(CONTACT_TYPE == VOIP_CONTACTS){
                newData = ContactsManager.getVoipContacts(getActivity());
            }else{
                newData = ContactsManager.getAllContacts(getActivity());
            }
            customAdapter.contacts().clear();
            customAdapter.contacts().addAll(newData);
            customAdapter.notifyDataSetChanged();
        }
    }

我正在onCreate中注意它:

getActivity().getContentResolver().registerContentObserver(MyContentProvider.CONTENT_URI, true, myObserver);

在我的onOptionItemSelected中,点击其中一个项目,更新如下:

getActivity().getContentResolver().update(ContactsContentProvider.CONTENT_URI, values, where, null);

1 个答案:

答案 0 :(得分:0)

在您给出的示例中,您没有注册和更新相同的URI。

您正在注册以收听MyContentProvider.CONTENT_URI uri上的更改,但您正在对ContactsContentProvider.CONTENT_URI uri进行更改。