notifyDataSetChanged не работает в recyclerView

Я использую адаптер recyclerView с адаптером. все работает хорошо, но когда я пытаюсь изменить некоторые данные (отметить элемент как понравившийся), но 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();
    }

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);
    }
    }

person Stan Malcolm    schedule 09.11.2015    source источник
comment
Посмотрите, дает ли вам полезный ответ на некоторые из этих вопросов: > stackoverflow.com/questions/24740557/ - stackoverflow.com/questions/24495542/ - stackoverflow.com/questions/28225563/ - stackoverflow.com/questions/27714127/   -  person androidevil    schedule 09.11.2015
comment
Недостаточно информации для ответа на ваш вопрос. 1. Уведомляет ли реализация вашего поставщика об изменениях данных? 2. Как вы обрабатываете обратные вызовы загрузчика (покажите нам)? Кроме того, mContactAdapter.notifyDataSetChanged(); в вашем прослушивателе кликов не требуется, если вы собираетесь обновлять адаптер из обратного вызова загрузчика.   -  person Ari    schedule 09.11.2015


Ответы (3)


Как вы реализовали свой mContactAdapter? Это подкласс RecyclerView.Adapter?

Вы можете использовать следующие методы для обновления RecyclerView после изменения набора данных.

    notifyItemInserted(n);
    notifyItemRemoved(n);
    notifyItemChanged(n);
person alijandro    schedule 09.11.2015
comment
я обновляю свой вопрос и публикую свой адаптер. пожалуйста, взгляните - person Stan Malcolm; 09.11.2015
comment
@StanMalcolm Вы забыли поменять местами курсор после OnFavouriteItemClick, я не видел никакого кода. - person alijandro; 09.11.2015

Как вы читаете данные из своей базы данных в свой адаптер? Если вы читаете его в список или что-то в этом роде и используете его при вызове адаптера, то после добавления данных в базу данных вы должны заново заполнить свой список, а затем вызвать notifyDataSetChange();

person Szamot    schedule 09.11.2015

Наверное:

Вы получаете данные от ContentResolver.

Затем вы обновляете ContentResolver.

Теперь ContentResolver изменился, но данные не изменились.

Попробуйте восстановить данные из ContentResolver или просто datas.get(index).change.

Затем notifyDataSetChange().

person tiny sunlight    schedule 09.11.2015