2014-09-03 67 views
0

所以我有一個老問題:代碼工作正常,而不應該。任何人都能猜到它怎麼可能?這個SimpleCursorAdapter如何工作正常?

我正在顯示聯繫人列表,每個聯繫人都有照片縮略圖。返回的遊標數據沒有任何照片縮略圖數據,但每個聯繫人的縮略圖都正確顯示。

列表項的看法:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:orientation="horizontal" 
    > 

    <ImageView 
     android:id="@+id/userpic" 
     android:layout_width="150dp" 
     android:layout_height="150dp" 
     android:contentDescription="Userpic" 
     /> 

    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:clickable="true" 
     android:textSize="24sp" 
     android:padding="12dp" 
     android:layout_gravity="center_vertical" 
     /> 
</LinearLayout> 

的主要代碼創建光標

private static class CursorAdapter extends SimpleCursorAdapter { 
    private static final String[] FROM = new String[]{ 
      Contacts.DISPLAY_NAME_PRIMARY, 
      Contacts.PHOTO_THUMBNAIL_URI 
    }; 
    private static final int[] TO = new int[]{ 
      android.R.id.text1, 
      R.id.userpic 
    }; 

    public CursorAdapter(Activity activity, Cursor c) { 
     super(activity, R.layout.contacts_item, c, FROM, TO, 0); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     // Here I logged cursor contents and am sure that thumbnail column data is null. 
     dumpCursorCurrent(cursor); 

     View view = super.newView(context, cursor, parent); 

     int columnIndex = cursor.getColumnIndexOrThrow(Contacts.PHOTO_THUMBNAIL_URI); 
     String thumbnailUriString = cursor.getString(columnIndex); 
     if (thumbnailUriString != null) { 
      throw new RuntimeException("Never comes here"); 
     } 
     return view; 
    } 
} 

代碼:

ContentResolver contentResolver = getActivity().getContentResolver(); 
    Cursor c = contentResolver.query(
      Contacts.CONTENT_URI, 
      projection, 
      null, 
      null, 
      null 
    ); 

所以列表中有適當照片有每個接觸照片。

我調試SimpleCursorAdapter代碼,它不應該工作,它調用imageView.setImageURI(Uri.parse("")),自然記錄的每一行警告:

1月9日至3日:47:20.023 27814-27814/me.lazerka .mf.android E/BitmapFactory: 無法解碼碼流:java.io.FileNotFoundException:/:開放 失敗:EISDIR(是一個目錄)1月9日至3日:47:20.023

27814-27814 /我。 lazerka.mf.android I/System.out:resolveUri失敗 錯誤的位圖uri:

那麼,誰爲每個ImageView設置了正確的imageURI,它在哪裏需要它(遊標始終爲空)?

+1

你確定光標到處都是空嗎?試過DatabaseUtils.dumpCursor()? – pskink 2014-09-03 09:04:31

+0

感謝'DatabaseUtils'建議,它顯示確實沒有空值。竅門是在'CursorAdapter#getView()' - 我有一個項目與空照片,我添加一個項目與非空照片。但在getView()中_reused_現有的視圖,而不調用newView()我把我的斷點。所以它正在調用newView來與我以前已經有過的空照片進行聯繫。 如果您關心積分,請隨時發佈答案,我會接受,謝謝。 – 2014-09-04 04:43:24

+1

很高興聽到它現在的作品 – pskink 2014-09-04 05:11:53

回答

0

該問題隱藏在SimpleCursorAdapter的實現中:它重用視圖,並且僅爲最後一個列表項調用newView()。所以當我添加一個聯繫人時,它重用了以前的視圖,設置了一個合適的照片,並且沒有調用newView(),所以我的斷點沒有觸發。