如何实现ContentObserver?

时间:2014-07-10 07:30:58

标签: android android-contentprovider contentobserver

我有ContentProvider,使用它我正在填充ListView。我需要点击其中一个menu-item。它会更新我的数据集,但我需要反映ListView中的更改。我读到了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);

现在什么???那是吗?或者我需要调用一些方法等?

**Edite**

我的内容提供商中的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;
   }

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

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

1 个答案:

答案 0 :(得分:1)

对我来说似乎没问题,如果你的CONTENT_URI方法没有被调用,每次你的ContentObserver更新(插入,删除或修改)时都应该触发onChange()。确保您指向ContentProvider中的正确URI。

您应添加的一件事是取消注册内容观察者,在onPause()方法中,您应该执行以下操作:

getContentResolver().unregisterContentObserver(myObserver);

希望它有所帮助!