从游标检索的图像为null(simplecursoradapter)

时间:2016-09-27 15:36:20

标签: android listview nullpointerexception simplecursoradapter

我希望在列表视图中显示我的数据库中的图像,以防存在。当没有图像时,它会从我的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);
}
}

谢谢!

1 个答案:

答案 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);
}