Я использую адаптер recyclerView whit. все работает хорошо, но когда я пытаюсь изменить некоторые данные (отмечать как понравилось), но notifyDataSetChanged не обновляет его в режиме реального времени. если я выйду из активности и запустите его снова - все данные сохраняются и корректируются.notifyDataSetChanged не работает в recyclerView
вот мой код:
@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();
}
EDIT вот мой адаптер:
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);
}
}
Смотрите, если некоторые из этих вопросов дает полезный ответ вам: - http://stackoverflow.com/questions/24740557/notifydatasetchanged-not-working-on-recyclerview - http://stackoverflow.com/questions/24495542/notifydatasetchange-not-working-on-recyclerview - http://stackoverflow.com/questions/28225563/recyclerview-notifydatasetchanged-not-working-after-parse-query - http://stackoverflow.com/questions/27714127/recyclerview-adapter-notifydatasetchanged-not-working – androidevil
nope, no one help –
Информация не достаточна для ответа на ваш вопрос. 1. Осуществляет ли ваша реализация поставщика уведомление об изменениях данных? 2. Как вы обрабатываете обратные вызовы загрузчика (покажите нам) ?. Кроме того, 'mContactAdapter.notifyDataSetChanged();' в вашем прослушивателе кликов не требуется, если вы собираетесь обновить адаптер из обратного вызова загрузчика. – Ari