2015-11-09 40 views
0

我正在使用recyclerView惠普适配器。所有工作都很好,但是当我尝试更改某些数据(标记为喜欢的项目)时,但notifyDataSetChanged不会实时更新它。如果我退出活动并再次启动它 - 所有数据保存并更正。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

看看其中的一些问题提供了一个有用的答案给你: - 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,没有人帮忙 –

+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或类似的东西,并在调用适配器时使用它,那么在将数据添加到数据库之后,应重新填充List,然后调用notifyDataSetChange();

0

我想:

你从ContentResolver得到DATAS。

然后你更新ContentResolver

现在ContentResolver已经改变,但数据没有改变。

尝试从ContentResolver或只是datas.get(index).change的reget dat。

然后notifyDataSetChange()