我正在使用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 ))";
答案 0 :(得分:1)
这是因为RecyclerView
的工作方式,并且与您访问联系人数据的方式无关。 RecyclerView
仅为每次适合屏幕的每个视图创建ViewHolder
,然后在屏幕滚动时回收这些视图。然后,该视图的新内容将应用于onBindViewHolder()
。
由于您之前可能已为ViewHolder.textHomePhone
和ViewHolder.textWorkPhone
文字视图分配了文字,因此当这些视图持有者获得回收时,该文字仍然存在。因此,如果新联系人只有一个手机号码,则主页号码和工作号码的文本仍将由前一个占用ViewHolder
的联系人填写。
要解决此问题,您需要检查联系人是否是否具有每种类型的数量(移动设备,家庭和工作),如果设置了相应的{{{ 1}}到TextView
。
一种简单的方法是在循环之前创建三个布尔值,然后再检查它们:
View.GONE
答案 1 :(得分:0)
我认为问题出在以下几行:
if (dataCursor.moveToFirst())
您将数据光标移动到每个调用中的第一个元素,这是不必要的,这将撤消函数顶部的以下行:
dataCursor.moveToPosition(position);
如果删除if
语句,它应该可以正常工作