마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

잘 되던 리스트뷰였는데 BLOB타입의 이미지를 불러와 같이 보여주려 하는데 오류가 뜹니다.

0 추천

원래는 DB의 값을 불러와서 보여주던 ListView 였는데, 이 DB 테이블에 BLOB타입의 이미지를 넣고 불러오려 했는데 그 과정에서 오류가 나는듯 합니다.

일단 listActivity 입니다.

public class listActivity extends Fragment {
    private static final String TAG = "listActivity";
    private DbOpenHelper mDbOpenHelper;
    private ArrayList<ListDto> mInfoArray;
    private ListAdapter mAdapter;
    private View v;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        v = inflater.inflate(R.layout.listview, container, false);
        setLayout();
        mDbOpenHelper = new DbOpenHelper(getActivity());
        try {
            mDbOpenHelper.open();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 리스트뷰 객체 참조
        mInfoArray = new ArrayList<ListDto>();
        doWhileCursorToArray();
        // mAdapter.setArrayList(mInfoArray);
        // mAdapter.notifyDataSetChanged();
        for(ListDto i : mInfoArray) {
            DLog.d(TAG, "mid = " + i.getMid());
            DLog.d(TAG, "mname = " + i.getMname());
            DLog.d(TAG, "memail = " + i.getMemail());
            DLog.d(TAG, "mphone = " + i.getMphone());
            DLog.d(TAG, "mcname = " + i.getMcname());
            DLog.d(TAG, "mcaddr = " + i.getMcaddr());
            DLog.d(TAG, "mcposition = " + i.getMcposition());
            DLog.d(TAG, "mcurl = " + i.getMcurl());
            DLog.d(TAG, "mncimg = " + i.getMncimg());
        }
        mAdapter = new ListAdapter(getActivity(), mInfoArray);
        mListView.setAdapter(mAdapter);
        mListView.setOnItemClickListener(ClickListener);
        return v;
    }
    
    @Override
    public void onDestroy() {
        mDbOpenHelper.close();
        super.onDestroy();
    }
    
    private OnItemClickListener ClickListener = new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            
            DLog.e(TAG, "position = " + position);
            Intent intent = new Intent(getActivity(), MapActivity.class);
            
            intent.putExtra("mid", mInfoArray.get(position).getMid());
            intent.putExtra("mname", mInfoArray.get(position).getMname());
            intent.putExtra("memail", mInfoArray.get(position).getMemail());
            intent.putExtra("mphone", mInfoArray.get(position).getMphone());
            intent.putExtra("mcname", mInfoArray.get(position).getMcname());
            intent.putExtra("mcaddr", mInfoArray.get(position).getMcaddr());
            intent.putExtra("mcposition", mInfoArray.get(position).getMcposition());
            intent.putExtra("mcurl", mInfoArray.get(position).getMcurl());
            intent.putExtra("mncimg", mInfoArray.get(position).getMncimg());

            startActivity(intent);
            return;
        }

    };

    private void doWhileCursorToArray() {

        Cursor cursor = mDbOpenHelper.selectMate();
        DLog.e(TAG, "COUNT = " + cursor.getCount());
        cursor.moveToFirst();

        while (cursor.moveToNext()) {
            ListDto listDto = new ListDto(
                    cursor.getInt(cursor.getColumnIndex("mid")),
                    cursor.getString(cursor.getColumnIndex("mname")),
                    cursor.getString(cursor.getColumnIndex("memail")),
                    cursor.getString(cursor.getColumnIndex("mphone")),
                    cursor.getString(cursor.getColumnIndex("mcname")),
                    cursor.getString(cursor.getColumnIndex("mcaddr")),
                    cursor.getString(cursor.getColumnIndex("mcposition")),
                    cursor.getString(cursor.getColumnIndex("mcurl")),
                    cursor.getBlob(cursor.getColumnIndex("mncimg"))
            );
            mInfoArray.add(listDto);
        }
        cursor.close();
    }
    private ListView mListView;

    private void setLayout() {
        mListView = (ListView) v.findViewById(R.id.listView1);
    }
/*
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
*/
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.NFC) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

그리고 여기서 ListAdapter와 ListDto에서 메소드를 불러와 리스트뷰에 표시할수 있게끔 하였는데요.

ListAdapter.java, ListDto.java 글자수 제한으로 댓글로 올리겠습니다.

 

코드는 이렇게 작성하였는데요. 오류 로그 에서는 

bitmap = BitmapFactory.decodeByteArray(ncimg, 0, ncimg.length);

여기가 null이라고 오류가 뜨던데 왜 뜨는건지 잘 모르겠습니다.

DB에 insert할땐 문제가 없었습니다.

 

아 그리고 데이터를 1번 넣었을땐 리스트뷰 아무것도 표시가 되지 않고, 오류도 안뜨며

2번째에 넣었을때 앱이 중지되며 오류가 뜹니다.

개발자님들 도와주세요. 앱 개발 초보라서 부족한 점이 많네요.

sean111 (1,220 포인트) 님이 2015년 9월 21일 질문
public class ListAdapter extends BaseAdapter {

    private LayoutInflater inflater;
    private ArrayList<ListDto> infoList;
    private ViewHolder viewHolder;
    Bitmap bitmap;

    public ListAdapter(Context c, ArrayList<ListDto> array){
        inflater = LayoutInflater.from(c);
        infoList = array;
    }

    @Override
    public int getCount() {
        return infoList.size();
    }

    @Override
    public Object getItem(int arg0) {
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

            if (v == null) {
                viewHolder = new ViewHolder();
                v = inflater.inflate(R.layout.listitem, null);
                viewHolder.mname = (TextView) v.findViewById(R.id.tv_mname);
                viewHolder.memail = (TextView) v.findViewById(R.id.tv_memail);
                viewHolder.mphone = (TextView) v.findViewById(R.id.tv_mphone);
                viewHolder.mcname = (TextView) v.findViewById(R.id.tv_mcname);
                viewHolder.mcaddr = (TextView) v.findViewById(R.id.tv_mcaddr);
                viewHolder.mcposition = (TextView) v.findViewById(R.id.tv_mcposition);
                viewHolder.mcurl = (TextView) v.findViewById(R.id.tv_mcurl);
                viewHolder.mncimg = (ImageView) v.findViewById(R.id.iv_mncimg);

                v.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) v.getTag();
            }
            byte[] ncimg = infoList.get(position).getMncimg();

                bitmap = BitmapFactory.decodeByteArray(ncimg, 0, ncimg.length);

                viewHolder.mname.setText(infoList.get(position).getMname());
                viewHolder.memail.setText(infoList.get(position).getMemail());
                viewHolder.mphone.setText(infoList.get(position).getMphone());
                viewHolder.mcname.setText(infoList.get(position).getMcname());
                viewHolder.mcaddr.setText(infoList.get(position).getMcaddr());
                viewHolder.mcposition.setText(infoList.get(position).getMcposition());
                viewHolder.mcurl.setText(infoList.get(position).getMcurl());
                viewHolder.mncimg.setImageBitmap(bitmap);

        return v;
    }
/*
    public void setArrayList(ArrayList<ListDto> arrays) {
        this.infoList = arrays;
    }
*/
    public ArrayList<ListDto> getArrayList() {
        return infoList;
    }

    class ViewHolder{
        TextView mname, memail, mphone, mcname, mcaddr, mcposition, mcurl;
        ImageView mncimg;
    }
}
public class ListDto {
    private int mid;
    private String mname;
    private String memail;
    private String mphone;
    private String mcname;
    private String mcaddr;
    private String mcposition;
    private String mcurl;
    // private String mncimg;
    private byte[] mncimg;



    public ListDto(int mid, String mname, String memail, String mphone, String mcname, String mcaddr, String mcposition, String mcurl, byte[] mncimg){

        this.mid = mid;
        this.mname = mname;
        this.memail = memail;
        this.mphone = mphone;
        this.mcname = mcname;
        this.mcaddr = mcaddr;
        this.mcposition = mcposition;
        this.mcurl = mcurl;
        this.mncimg = mncimg;
    }

    public int getMid() {return mid;
    }
    public String getMname() {return mname;}
    public String getMemail() {return memail;}
    public String getMphone() {return mphone;}
    public String getMcname() {return mcname;}
    public String getMcaddr() {return mcaddr;}
    public String getMcposition() {return mcposition;}
    public String getMcurl() {return mcurl;}
    public byte[] getMncimg() {return mncimg;}
}
오류로그입니다.

09-21 10:13:47.063  11848-11848/org.androidtown.lbs.map D/receive﹕ ncimage : [B@3c7e2fd
09-21 10:13:47.113  11848-11848/org.androidtown.lbs.map D/receive﹕ ncbitmap : android.graphics.Bitmap@ff2ebf2
09-21 10:13:47.193  11848-11877/org.androidtown.lbs.map V/RenderScript﹕ Application requested CPU execution
09-21 10:13:47.203  11848-11877/org.androidtown.lbs.map V/RenderScript﹕ 0xaf25b800 Launching thread(s), CPUs 4
09-21 10:13:56.923  11848-11855/org.androidtown.lbs.map I/art﹕ Debugger is no longer active
09-21 10:14:26.743  11848-11848/org.androidtown.lbs.map D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
09-21 10:14:26.863  11848-11848/org.androidtown.lbs.map I/Timeline﹕ Timeline: Activity_launch_request id:org.androidtown.lbs.map time:10389070
09-21 10:14:26.913  11848-11848/org.androidtown.lbs.map D/Activity﹕ performCreate Call secproduct feature valuefalse
09-21 10:14:26.913  11848-11848/org.androidtown.lbs.map D/Activity﹕ performCreate Call debug elastic valuetrue
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/AbsListView﹕ Get MotionRecognitionManager
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map E/listActivity﹕ COUNT = 2
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mid = 2
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mname = 댜
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ memail = rn.com
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mphone = 4949
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mcname = 규구
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mcaddr = 쳐펴
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mcposition = 냐내
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mcurl = eb.com
09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mncimg = null
09-21 10:14:26.943  11848-11848/org.androidtown.lbs.map D/AbsListView﹕ Get MotionRecognitionManager
09-21 10:14:26.983  11848-11848/org.androidtown.lbs.map D/AndroidRuntime﹕ Shutting down VM
09-21 10:14:26.983  11848-11848/org.androidtown.lbs.map E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: org.androidtown.lbs.map, PID: 11848
    java.lang.NullPointerException: Attempt to get length of null array
            at org.androidtown.lbs.map.ListAdapter.getView(ListAdapter.java:67)
            at android.widget.AbsListView.obtainView(AbsListView.java:2825)
            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:2629)
            at android.view.View.layout(View.java:16688)
            at android.view.ViewGroup.layout(ViewGroup.java:5328)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
            at android.view.View.layout(View.java:16688)
            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:16688)
            at android.view.ViewGroup.layout(ViewGroup.java:5328)
            at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1594)
            at android.view.View.layout(View.java:16688)
            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:16688)
            at android.view.ViewGroup.layout(ViewGroup.java:5328)
            at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494)
            at android.view.View.layout(View.java:16688)
            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:16688)
            at android.view.ViewGroup.layout(ViewGroup.java:5328)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2321)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2034)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6641)
            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)

1개의 답변

0 추천
 
채택된 답변

로그에 답이 나와 있네요.


09-21 10:14:26.933  11848-11848/org.androidtown.lbs.map D/listActivity﹕ mncimg = null

byte[] 값이 null 입니다.

카라드레스 (2,910 포인트) 님이 2015년 9월 21일 답변
sean111님이 2015년 9월 22일 채택됨
해결됐네요 감사합니다.
...