在滚动视图时,Recyclerview会更改contactsContract中phoneNumber的值

时间:2016-08-16 15:30:50

标签: android android-recyclerview

我正在使用recyclerview实施一项活动。我加载了手机中的所有联系人(姓名和电话号码)。一切看起来还不错,问题是当我在视图中滚动时,当我回到同一个联系人时,此联系人没有正确的电话号码。是唯一改变的。姓名和联系电话显示正确。

例如,一个联系人只设置了手机。初始化时看起来不错,但是如果我滚动并返回,则主页和工作设置为其他数字,并且此用户仅设置了移动电话

一些帮助将是apreciate!

这是我在recyclelerAdapter中的onBind方法:

 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        dataCursor.moveToPosition(position);

            holder.mTextView.setText((dataCursor.getString(1)));

            ContentResolver cr = context.getContentResolver();
            String contactId = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Contacts._ID));

            Long photoTest = dataCursor.getLong(dataCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));

            if (dataCursor.moveToFirst()) {
                Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);

                if (phones == null) {
                    phones.close();
                } else {

                    while (phones.moveToNext()) {
                        try {
                            Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{contactId}, null);
                            while (pCur.moveToNext()) {
                                int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                                String phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                                if(phoneType == TYPE_MOBILE){
                                    holder.mNumberMoBilePhone.setText(phoneNumber);
                                    holder.mNumberMoBilePhone.setVisibility(View.VISIBLE);
                                    holder.textMobilePhone.setVisibility(View.VISIBLE);
                                }else if(phoneType == TYPE_HOME){
                                    holder.mNumberHomePhone.setText(phoneNumber);
                                    holder.mNumberHomePhone.setVisibility(View.VISIBLE);
                                    holder.textHomePhone.setVisibility(View.VISIBLE);
                                }else if(phoneType == TYPE_WORK){
                                    holder.mNumberWorkPhone.setText(phoneNumber);
                                    holder.mNumberWorkPhone.setVisibility(View.VISIBLE);
                                    holder.textWorkPhone.setVisibility(View.VISIBLE);
                                }else{}

                            }
                        } catch (NullPointerException n) {

                        }
                    }
                    phones.close();
                }
            }

            if (photoTest != null) {
                ContactPhotoLoaderSdk5.instance().loadPhoto(holder.mContactPhoto, photoTest);
            }

    }

不确定是否必须使用thit,但这是我的选择:

String select = "((" + ContactsContract.Contacts.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " != 0 ))";

2 个答案:

答案 0 :(得分:1)

这是因为RecyclerView的工作方式,并且与您访问联系人数据的方式无关。 RecyclerView仅为每次适合屏幕的每个视图创建ViewHolder,然后在屏幕滚动时回收这些视图。然后,该视图的新内容将应用于onBindViewHolder()

由于您之前可能已为ViewHolder.textHomePhoneViewHolder.textWorkPhone文字视图分配了文字,因此当这些视图持有者获得回收时,该文字仍然存在。因此,如果新联系人只有一个手机号码,则主页号码和工作号码的文本仍将由前一个占用ViewHolder的联系人填写。

要解决此问题,您需要检查联系人是否是否具有每种类型的数量(移动设备,家庭和工作),如果设置了相应的{{{ 1}}到TextView

一种简单的方法是在循环之前创建三个布尔值,然后再检查它们:

View.GONE

答案 1 :(得分:0)

我认为问题出在以下几行:

if (dataCursor.moveToFirst())

您将数据光标移动到每个调用中的第一个元素,这是不必要的,这将撤消函数顶部的以下行:

dataCursor.moveToPosition(position);

如果删除if语句,它应该可以正常工作