所以我有一个老问题:代码工作正常而不应该。谁能想到怎么可能呢?
我正在显示联系人列表,其中包含每个联系人的照片缩略图。返回的光标数据没有任何照片缩略图数据,但每个联系人都正确显示缩略图。
列出项目视图:
<?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;
}
}
创建Cursor的代码:
ContentResolver contentResolver = getActivity().getContentResolver();
Cursor c = contentResolver.query(
Contacts.CONTENT_URI,
projection,
null,
null,
null
);
因此,列表中包含每张有照片的联系人的正确的照片。
我调试了SimpleCursorAdapter代码,它不应该工作,它调用imageView.setImageURI(Uri.parse(""))
,并自然地为每行记录警告:
09-03 01:47:20.023 27814-27814 / me.lazerka.mf.android E / BitmapFactory: 无法解码流:java.io.FileNotFoundException:/:open 失败:EISDIR(是一个目录)09-03 01:47:20.023
27814-27814 / me.lazerka.mf.android I / System.out:resolveUri失败 坏位图uri:
那么谁为每个ImageView设置了正确的imageURI,它在哪里(光标始终为null)?
答案 0 :(得分:0)
该问题隐藏在SimpleCursorAdapter的实现中:它重用了视图,并仅为最后一个列表项调用newView()。所以当我添加一个联系人时,它重用了以前的视图,设置了一张合适的照片,并且没有调用newView(),所以我的断点没有触发。