我希望在列表视图中显示我的数据库中的图像,以防存在。当没有图像时,它会从我的drawable文件夹中显示一个图标。但是当我尝试从游标光标中检索它时.getBlob(i)始终为null,listview始终显示图标占位符。有人知道这是为什么吗?
这是我的代码:
private void populateListView(){
Cursor cursor = myDb.getAllItems();
String[] fromFieldNames = new String[] {Database.COL_IMAGE, Database.COL_DATE, Database.COL_HEAD};
int[] toViewIds = new int[] {R.id.list_view_image, R.id.list_view_date, R.id.list_view_headline};
cursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.list_view_search, cursor, fromFieldNames, toViewIds, 0);
cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int i) {
cursor.moveToFirst();
if(view.getId() == R.id.list_view_image) {
imageView = (ImageView) view.findViewById(R.id.list_view_image);
Bitmap image = DbBitmapUtility.getImage(cursor.getBlob(i));
if (image != null) { //image is somehow always null... I have tried everything to extract this image but it won't work
imageView.setImageBitmap(image);
} else {
imageView.setImageResource(R.drawable.ic_image_white);
}
return true;
}
return false;
}
});
listView.setAdapter(cursorAdapter);
listView.setTextFilterEnabled(true);
}
这是logcat:
FATAL EXCEPTION: main
Process: com.example.koesc_000.pocketdiary, PID: 14153
java.lang.NullPointerException: Attempt to get length of null array
at com.example.koesc_000.pocketdiary.DbBitmapUtility.getImage(DbBitmapUtility.java:30)
at com.example.koesc_000.pocketdiary.Activities.SearchActivity$1.setViewValue(SearchActivity.java:83)
at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:146)
at android.widget.CursorAdapter.getView(CursorAdapter.java:254)
at android.widget.AbsListView.obtainView(AbsListView.java:2823)
at android.widget.ListView.makeAndAddView(ListView.java:1884)
at android.widget.ListView.fillDown(ListView.java:713)
at android.widget.ListView.fillFromTop(ListView.java:779)
at android.widget.ListView.layoutChildren(ListView.java:1693)
at android.widget.AbsListView.onLayout(AbsListView.java:2627)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1702)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1556)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1702)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1556)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1702)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1556)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1465)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:16711)
at android.view.ViewGroup.layout(ViewGroup.java:5328)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2319)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2032)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
at android.view.Choreographer.doCallbacks(Choreographer.java:590)
at android.view.Choreographer.doFrame(Choreographer.java:560)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
编辑: 这是DbBitmapUtility:
public class DbBitmapUtility {
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
if(bitmap != null){
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 10, stream);
return stream.toByteArray();
}else{
return null;
}
}
// convert from byte array to bitmap
public static Bitmap getImage(byte[] image) {
return BitmapFactory.decodeByteArray(image, 0, image.length);
}
}
谢谢!
答案 0 :(得分:0)
现在它正在运作......我不知道为什么它昨天没有工作。我以为我已经尝试过这个但它现在没有用,但现在确实如此。
private void populateListView(){
cursor = myDb.getAllItems();
String[] fromFieldNames = new String[] {Database.COL_IMAGE, Database.COL_DATE, Database.COL_HEAD};
int[] toViewIds = new int[] {R.id.list_view_image, R.id.list_view_date, R.id.list_view_headline};
cursorAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.list_view_search, cursor, fromFieldNames, toViewIds, 0);
cursor.moveToFirst();
cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int i) {
if(view.getId() == R.id.list_view_image) {
imageView = (ImageView) view.findViewById(R.id.list_view_image);
Bitmap image = null;
byte[] blob = cursor.getBlob(i);
if(blob!=null){
System.out.println("blob: "+blob.toString());
image = DbBitmapUtility.getImage(blob);
imageView.setImageBitmap(image);
} else {
imageView.setImageResource(R.drawable.ic_image_white);
}
return true;
}
return false;
}
});
listView.setAdapter(cursorAdapter);
listView.setTextFilterEnabled(true);
}