2015-11-09 2 views
0

Я использую адаптер 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); 
    } 
    } 
+0

Смотрите, если некоторые из этих вопросов дает полезный ответ вам: - 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

+0

nope, no one help –

+0

Информация не достаточна для ответа на ваш вопрос. 1. Осуществляет ли ваша реализация поставщика уведомление об изменениях данных? 2. Как вы обрабатываете обратные вызовы загрузчика (покажите нам) ?. Кроме того, 'mContactAdapter.notifyDataSetChanged();' в вашем прослушивателе кликов не требуется, если вы собираетесь обновить адаптер из обратного вызова загрузчика. – Ari

ответ

0

Как вы реализуете свой mContactAdapter? Является ли это подклассом RecyclerView.Adapter?

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

notifyItemInserted(n); 
    notifyItemRemoved(n); 
    notifyItemChanged(n); 
+0

Я обновляю свой вопрос и отправляю свой адаптер. пожалуйста, посмотрите –

+0

@StanMalcolm Вы забыли поменять свой курсор после 'OnFavouriteItemClick', я не видел никакого кода. – alijandro

0

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

0

Я думаю:

Вы получаете от ContentResolver ДАННЫЕ.

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

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

Попробуйте reget dats от ContentResolver или просто datas.get (указатель) .change.

Then notifyDataSetChange().

Смежные вопросы