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

custom listView를 만들고 있는데 이미지를 db를통해 불러온 비트맵 이미지로 각각 설정해주고 싶습니다. [closed]

+1 추천

 

현재 웹호스팅 서버에 database와 php를 이용해서 string 값을 받으면 php를 통해 database에 있는 해당 이름과 일치하는 비트맵 이미지의 이름(string)을 찾고 사진이 저장되어있는 폴더에 해당 이름과 일치하는 놈을

마지막에 setImageBitmap(bitmap)으로 이미지 뷰에 저장 시켜 주는 방식을 사용하고 있습니다.

 

아래가 비트맵 이미지를 이미지뷰에 적용시키는 코드입니다.

 

    String name;
    String url;

    public DownloadImage(String name){
        this.name = name;
    }

    @Override
    protected void onPreExecute() {
        //URL 선언
    }

    @Override
    protected Bitmap doInBackground(Void... voids) {

        //URL 연결코드 (길어서 삭제했습니다.)

    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);

        if(bitmap != null){

            //이미지뷰이름.setImageBitmap(bitmap);
        }
    }

다른 곳에서는 그냥 javaclass에 붙어있는 xml의 R.id를 불러오면 되는거라 쉽게 적용이 가능한데

 

커스텀 리스트뷰에서는 어떻게 적용해야할지 잘 모르겠습니다.

 

ListAdapter는 유튜브에서 본대로 만들어서 틀은 만들어 냈고 텍스트는 단순히 연결된 string을 setText해서 나타내주었습니다. 그런데 ImageView는 뭘 고쳐야할지 알려주시면 감사하겠습니다.

 

아래가 현재 수정중인 ListAdapter입니다.

 

public class UserListAdapter extends BaseAdapter {

    private Context context;
    private List<Shop> userList;

    ImageView shop_shopimg; // getView에서 초기화 하면 아래 AsyncTask에서 쓸때 초기화가 안되어 있다고 해서 임시로 여기서 선언했습니다...
    
    

    public UserListAdapter(Context context, List<Shop> userList){
        this.context = context;
        this.userList = userList;
    }

    @Override
    public int getCount() {... }

    @Override
    public Object getItem(int i) {...}

    @Override
    public long getItemId(int i) {...}

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        View v = View.inflate(context, R.layout.user, null);

        final TextView shop_shopID = (TextView)v.findViewById(R.id.shopID);
        TextView shop_shopTel = (TextView)v.findViewById(R.id.shopTel);
        // 위의 TextView 초기화처럼 여기서 ImageVIew를 초기화 하고 싶었는데 초기화가 안되서 위에서 선언후 여기서 연결을 해주었는데 연결이 안되는것같습니다.
        shop_shopimg = (ImageView)v.findViewById(R.id.shopImg);

        shop_shopID.setText(userList.get(i).getShopID());
        shop_shopTel.setText(userList.get(i).getShopTel());
        

        new SearchShop(userList.get(i).getShopImg()).execute();
        //AsyncTask를 이용해서 userList.get(i).getShopImg()에 저장된 String값을 이용해서 폴더에 저장된 Bitmap를 찾도록 함.


        v.setTag(userList.get(i).getShopID());

        return v;
    }

    //Bitmap 이미지를 찾는 AsyncTask
    private class SearchShop extends AsyncTask<Void, Void, String>{


        String _number, targetURL;

        public SearchShop(String _number){
            this._number = _number;
        }


        @Override
        protected void onPreExecute() {
            

            //URL 선언
        }

        @Override
        protected String doInBackground(Void... voids) {
            try{
                //URL 연결 코드

            }catch (Exception e){
                e.printStackTrace();

            }
            return null;
        }


        @Override
        protected void onPostExecute(String result) {
            try {

                String title_image;

                JSONObject jsonObject =new JSONObject(result);
                JSONArray jsonArray = jsonObject.getJSONArray("response");

                for(int i=0; i<jsonArray.length(); i++){
                    JSONObject object = jsonArray.getJSONObject(i);

                    title_image = object.getString("title_image");
                    
                    new DownloadImage(title_image).execute();

                }

            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    private class DownloadImage extends AsyncTask<Void, Void, Bitmap>{

        String name;
        String url;

        public DownloadImage(String name){
            this.name = name;
        }

        @Override
        protected void onPreExecute() {
            url = AppConfig.URL_BASIC+"pictures/"+name+".JPG";
        }

        @Override
        protected Bitmap doInBackground(Void... voids) {

            try{
                URLConnection connection = new URL(url).openConnection();
                connection.setConnectTimeout(1000 * 30);
                connection.setReadTimeout(1000 * 30);

                return BitmapFactory.decodeStream((InputStream)connection.getContent(), null, null);

            }catch (Exception e){
                e.printStackTrace();

                return null;
            }

        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);

            if(bitmap != null){
                //원래 여기서 선언한 ImageView에 .setImageBitmap을 해서 doinBackground에서 찾은 Bitmap 이미지를 붙여주는데 위에서 선언한 이미지뷰가 연결이 안되는건지 아니면 다른 이유에서인지 이미지를 불러오지 못하고 있습니다. 
                //shop_shopimg.setImageBitmap(bitmap);
            }
        }
    }
}

 

구글링을 제가 잘 못해서 그런가 CustomListView에 관한 예제를 여러개 찾아봤는데

 

모든 예제들이 미리 drawable에 저장된 이미지를 불러오거나 같은 이미지를 불러오는 방식을 사용하는데

 

저는 리스트뷰에 나타나지는 item 각각의 정보에 맞게 이미지를 붙여주고 싶은데 못찾고 있습니다....

 

좋은 예제가 있는 곳을 안다면 링크걸어주시면 정말 감사합니다.

 

질문을 종료한 이유: 다른 예제를 통해 완성했습니다. 혹시 참고하실분들을 위해 링크 두겠습니다. https://medium.com/@henen/%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%B7%B0-listview-3-with-glide%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80%EB%A1%9C%EB%93%9C-41856869a66
Mustone (350 포인트) 님이 2017년 8월 30일 질문
Mustone님이 2017년 8월 31일 closed
...