0

データベースが存在する場合に備えてリストビュー内の画像を表示したいとします。画像がない場合、私のドロウアブルフォルダからアイコンが表示されます。しかし、カーソルから取得しようとすると、cursor.getBlob(i)は常にnullになり、listviewは常にアイコンのプレースホルダを表示します。これはなぜ誰かが知っていますか?ここでカーソルから取得した画像がヌル(simplecursoradapter)

は私のコードです:ここでは

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) 

EDIT: ここ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

あなたDbBitmapUtility.java – Zartha

+0

を投稿することができますなぜあなたは遅延ロードのより良い –

+0

'cursor.moveToFirst()を使用してはいけない;' '内部setViewValue' ...魅惑的な – Selvin

答えて

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); 
} 
関連する問題