我正在使用recyclerView whit适配器。一切正常,但是当我试图更改一些数据(标记项目为喜欢),但notifyDataSetChanged不会实时更新它。如果我退出活动而不是再次启动它 - 所有数据都保存并更正。
这是我的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
initLoader();
setAdapter();
}
public void setAdapter(){
mContactAdapter = new ContactsAdapter(getActivity().getApplicationContext(), this);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mRecyclerView.setAdapter(mContactAdapter);
}
@Override
public void onFavoriteItemClicked(ImageView view, int position) {
mMainCursor.moveToPosition(position);
int status = -1;
int currentStatus = mMainCursor.getInt(ContactsActivityFragment.COL_CONTACT_FAVORITE);
switch (currentStatus){
case SU_VARIABLES.CONTACT_IS_FAVORITE:
view.setImageResource(R.drawable.icon_fav);
status = SU_VARIABLES.CONTACT_NOT_FAVORITE;
break;
case SU_VARIABLES.CONTACT_NOT_FAVORITE:
view.setImageResource(R.drawable.icon_fav_active);
status = SU_VARIABLES.CONTACT_IS_FAVORITE;
break;
}
ContentValues values = new ContentValues();
values.put(SU_Contract.ContactsEntry.CONTACT_FAVORITE, status);
String id = mMainCursor.getString(ContactsActivityFragment.COL_CONTACT_ID);
String selection = SU_Contract.ContactsEntry.CONTACT_ID + " = " + id;
getActivity().getContentResolver().update(SU_Contract.ContactsEntry.CONTENT_URI,values, selection, null);
mContactAdapter.notifyDataSetChanged();
}
修改 这是我的适配器:
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactsViewHolder> {
public ContactsAdapter(Context c, OnContactItemClicked clicked){
sContext = c;
sInterface = clicked;
}
private static OnContactItemClicked sInterface;
private static Context sContext;
private static Cursor sCursor;
private static ContactsViewHolder sHolder;
@Override
public ContactsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_people, parent, false);
sHolder = new ContactsViewHolder(rootView);
return sHolder;
}
@Override
public void onBindViewHolder(ContactsViewHolder holder, int position) {
if (sCursor != null){
sCursor.moveToPosition(position);
String name = sCursor.getString(ContactsActivityFragment.COL_CONTACT_NAME);
String phone = sCursor.getString(ContactsActivityFragment.COL_CONTACT_PHONE);
String imgUrl = sCursor.getString(ContactsActivityFragment.COL_CONTACT_IMAGE);
int currentStatus = sCursor.getInt(ContactsActivityFragment.COL_CONTACT_FAVORITE);
switch (currentStatus){
case SU_VARIABLES.CONTACT_NOT_FAVORITE:
sHolder.mUserRating.setImageResource(R.drawable.icon_fav);
break;
case SU_VARIABLES.CONTACT_IS_FAVORITE:
sHolder.mUserRating.setImageResource(R.drawable.icon_fav_active);
break;
}
holder.mUserName.setText(name);
if (phone != null && phone.length() > 9){
holder.mUserPhone.setText(phone);
}
}
}
@Override
public int getItemCount() {
int size = 0;
if (sCursor != null){
size = sCursor.getCount();
}
return size;
}
public void swapCursor(Cursor cursor){
if (sCursor != null && sCursor.isClosed()){
sCursor.close();
}
sCursor = cursor;
notifyDataSetChanged();
}
public static class ContactsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
@Bind(R.id.tv_profile_name) TextView mUserName;
@Bind(R.id.tv_contactItem_phone) TextView mUserPhone;
@Bind(R.id.img_user_card) ImageView mCardImg;
@Bind(R.id.img_user_phone) ImageView mPhoneImg;
@Bind(R.id.img_profile_rating) ImageView mUserRating;
@Bind(R.id.img_profile_photo) CircularImageView mUserPhoto;
public ContactsViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
}
@OnClick(R.id.img_profile_rating)
public void onFavoriteClicked(){
sInterface.onFavoriteItemClicked(sHolder.mUserRating, getAdapterPosition());
}
@Override
public void onClick(View v) {
int pos = getAdapterPosition();
sInterface.onRecyclerViewItemClicked(v, pos);
}
}
public interface OnContactItemClicked{
void onRecyclerViewItemClicked(View view, int position);
void onFavoriteItemClicked(ImageView view, int position);
}
}
答案 0 :(得分:0)
您是如何实施mContactAdapter
的?它是RecyclerView.Adapter
的子类吗?
您可以使用以下方法在数据集更改后更新RecyclerView
。
notifyItemInserted(n);
notifyItemRemoved(n);
notifyItemChanged(n);
答案 1 :(得分:0)
您如何将数据库中的数据读取到您的adatper?如果您将其读取到List或类似的东西并在调用适配器时使用它,那么在将数据添加到数据库之后,应该重新填充List,然后调用notifyDataSetChange();
答案 2 :(得分:0)
我想:
您从ContentResolver
获取数据。
然后您更新ContentResolver
。
现在ContentResolver
已更改,但数据未发生变化。
尝试从ContentResolver
重新获取dats,或者只尝试datas.get(index).change。
然后notifyDataSetChange()
。