0

I am using recyclerView whit adapter. all work good, but when i am trying to change some data (mark item as liked), but notifyDataSetChanged doesnt update it in real time. if i exit from activity and than start it again - all data save and correct.

here is my code:

@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 here is my Adapter:

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);
    }
    }
Stan Malcolm
  • 2,740
  • 5
  • 32
  • 53
  • See if some of these questions provides an useful answer to you: - 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 Nov 09 '15 at 14:25
  • There is not enough info to answer your question. 1. Does your provider implementation notify changes to the data? 2. How are you handling loader callbacks (show us)?. Also, `mContactAdapter.notifyDataSetChanged();` in your click listener is not necessary if you are going to update the adapter from the loader callback. – Ari Nov 09 '15 at 16:29

3 Answers3

0

How did you implement your mContactAdapter? Is it a subclass of RecyclerView.Adapter?

You can use following methods to update the RecyclerView after data set changed.

    notifyItemInserted(n);
    notifyItemRemoved(n);
    notifyItemChanged(n);
alijandro
  • 11,627
  • 2
  • 58
  • 74
0

How are you read data from your database to your adatper? If you read it to List or something like that and use it when you call adapter, then you should, after add your data to database, afresh fill your List and then call notifyDataSetChange();

Szamot
  • 366
  • 2
  • 12
0

I guess:

You get datas from ContentResolver.

Then you update ContentResolver.

Now ContentResolver has changed but datas hasn't changed.

Try reget dats from ContentResolver or just datas.get(index).change.

Then notifyDataSetChange().

tiny sunlight
  • 6,231
  • 3
  • 21
  • 42