notifyDataSetChanged在recyclerView中不起作用

时间:2015-11-09 14:21:44

标签: android android-recyclerview notifydatasetchanged

我正在使用recyclerView whit适配器。一切正常,但是当我试图更改一些数据(标记项目为喜欢),但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);
    }
    }

3 个答案:

答案 0 :(得分:0)

您是如何实施mContactAdapter的?它是RecyclerView.Adapter的子类吗?

您可以使用以下方法在数据集更改后更新RecyclerView

    notifyItemInserted(n);
    notifyItemRemoved(n);
    notifyItemChanged(n);

答案 1 :(得分:0)

您如何将数据库中的数据读取到您的adatper?如果您将其读取到List或类似的东西并在调用适配器时使用它,那么在将数据添加到数据库之后,应该重新填充List,然后调用notifyDataSetChange();

答案 2 :(得分:0)

我想:

您从ContentResolver获取数据。

然后您更新ContentResolver

现在ContentResolver已更改,但数据未发生变化。

尝试从ContentResolver重新获取dats,或者只尝试datas.get(index).change。

然后notifyDataSetChange()