2016-08-16 50 views
0

我正在使用recyclerview實施一項活動。我加載了手機中的所有聯繫人(姓名和電話號碼)。一切看起來都不錯,問題是當我在視圖中進行滾動時,當我回到同一聯繫人時,此聯繫人沒有正確的電話號碼。是唯一一個改變。姓名和聯繫電話顯示正確。Recyclerview在滾動視圖時更改contactsContract中phoneNumber的值

例如,一個聯繫人只設置了手機。初始化時看起來沒問題,但如果我滾動並回來,家庭和工作設置了另一個數字,並且此用戶只有設置移動電話

一些幫助將apreciate!

這是我在recyclerAdapter 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

我建議您在設置適配器時從數據庫獲取所有數據。將這些數據放入一個列表中並使用適配器中的列表。這樣可以提高性能,使代碼更清晰,並且更容易發現錯誤。 – Robbe

回答

1

出現這種情況,因爲方式RecyclerView工作,並且與您訪問聯繫人數據的方式無關。 A RecyclerView僅針對每次適合在屏幕上顯示的每個視圖創建一個ViewHolder,然後將這些視圖在屏幕滾動時回收。然後,該視圖的新內容將在onBindViewHolder()中應用。

既然你以前可能分配的文本爲ViewHolder.textHomePhoneViewHolder.textWorkPhone文本視圖,當這些觀點持有者得到回收的文本仍然存在。因此,如果新聯繫人只有一個手機號碼,則家庭號碼和工作號碼的文本仍將由先前聯繫人填寫ViewHolder

要解決這個問題,你需要檢查是否接觸有一些每種類型(移動,家庭和工作)的,如果是這樣設置相應TextView的知名度,View.GONE

一個簡單的方法來做到這將是你的循環之前,創建三個布爾值,然後事後檢查他們:

boolean hasMobile = false; 
boolean hasHome = false; 
boolean hasWork = false; 

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); 
     hasMobile = true; 
    }else if(phoneType == TYPE_HOME){ 
     holder.mNumberHomePhone.setText(phoneNumber); 
     holder.mNumberHomePhone.setVisibility(View.VISIBLE); 
     holder.textHomePhone.setVisibility(View.VISIBLE); 
     hasHome = true; 
    }else if(phoneType == TYPE_WORK){ 
     holder.mNumberWorkPhone.setText(phoneNumber); 
     holder.mNumberWorkPhone.setVisibility(View.VISIBLE); 
     holder.textWorkPhone.setVisibility(View.VISIBLE); 
     hasWork = true; 
    } 
} 

if(!hasMobile) { 
    holder.mNumberMobilePhone.setVisibility(View.GONE); 
    holder.textMobilePhone.setVisibility(View.GONE); 
} 

if(!hasHome) { 
    holder.mNumberHomePhone.setVisibility(View.GONE); 
    holder.textHomePhone.setVisibility(View.GONE); 
} 

if(!hasWork) { 
    holder.mNumberWorkPhone.setVisibility(View.GONE); 
    holder.textWorkPhone.setVisibility(View.GONE); 
} 
0

我認爲這個問題是與以下行:

if (dataCursor.moveToFirst()) 

您將數據光標移動到指向每個呼叫中​​不需要的第一個元素,這將撤消功能頂部的以下行:

dataCursor.moveToPosition(position); 

如果您刪除if語句,它應該正常工作

+0

Hi @pooya仍然有與您的解決方案相同的問題 –

+0

@ D.O。這很難從這裏調試,但是在你的代碼中也有一些語義問題,例如(phones.moveToNext())需要在這之前有phones.moveToFirst()。請參閱是否可以先糾正這些問題以獲得更可靠的輸出 – Pooya

+0

這是我在嘗試在我的代碼中讀取所有電話號碼的實現。也許這可以幫助你給我一些解決方案。是@anivaler的答案http://stackoverflow.com/questions/2356084/read-all-contacts-phone-numbers-in-android –