我有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);
答案 0 :(得分:1)
对我来说似乎没问题,如果你的CONTENT_URI
方法没有被调用,每次你的ContentObserver
更新(插入,删除或修改)时都应该触发onChange()
。确保您指向ContentProvider
中的正确URI。
您应添加的一件事是取消注册内容观察者,在onPause()
方法中,您应该执行以下操作:
getContentResolver().unregisterContentObserver(myObserver);
希望它有所帮助!