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

커스텀어댑터 리스트뷰 사용시 이미지가 하나만 나오는 문제입니다. 도움 부탁드려요.

0 추천

 

 

처음으로 질문 올려보네요..

 

 

위 사진과 같이 리스트뷰 갱신시 이미지가 하나만 나오고 있습니다.

한 리스트뷰에 한 이미지만 나올때도 있고, 여러 리스트뷰에 같은 이미지 여러개가 나올때도 있어요.

 

 

 

DB에 String 형태로 URI를 저장시키고, 리스트뷰 갱신시킬때 

그것을 String형태로 어탭터에 전달해서, 어댑터에서 그것을 URI.parse 해서 URI로 변환시켜서 비트맵이미지 만들어서 쓰고있어요.

 

//---------------------------    Main의 리스트뷰 갱신부분.. ---------------------------------

public void reset_wardrobe() {
        adapter_wardrobe = new CustomAdapter_listview_wardrobe(getApplicationContext());
        // 리스트뷰 참조 및 Adapter달기
        listView_wardrobe = (ListView) findViewById(R.id.listView_wardrobe1);
        listView_wardrobe.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView_wardrobe.setAdapter(adapter_wardrobe);

        arraylist_wardrobe = dbManager.select_clothesName();

        for (int i = 0; i < arraylist_wardrobe.size(); i++) {
            String clothes_name = arraylist_wardrobe.get(i);
            String file_name = dbManager.select_fileName(arraylist_wardrobe.get(i));  // URI를 String로
            String category_name = dbManager.select_category_byname(arraylist_wardrobe.get(i));
            String season_name = dbManager.select_season_byname(arraylist_wardrobe.get(i));
            String temp_name = dbManager.select_temp_byname(arraylist_wardrobe.get(i));
            String weather_name = dbManager.select_weather_byname(arraylist_wardrobe.get(i));
            String favor_name = dbManager.select_favor_byname(arraylist_wardrobe.get(i));

            Log.i("MainActivity", "season_name : " + season_name);

            if (clothes_name.equals("ㅡㅡㅡㅡ")) clothes_name = "";
            if (file_name.equals("ㅡㅡㅡㅡ")) file_name = "";
            if (category_name.equals("ㅡㅡㅡㅡ")) category_name = "";
            if (season_name.equals("ㅡㅡㅡㅡ")) season_name = "";
            if (temp_name.equals("ㅡㅡㅡㅡ")) temp_name = "";
            if (weather_name.equals("ㅡㅡㅡㅡ")) weather_name = "";
            if (favor_name.equals("ㅡㅡㅡㅡ")) favor_name = "";


            Listview_item_wardrobe c1 = new Listview_item_wardrobe(file_name, category_name, clothes_name,
                    season_name, temp_name, weather_name, favor_name);
            adapter_wardrobe.add(c1);
        }
        adapter_wardrobe.setCheckCount();
        // Data가 변경 되있음을 알려준다.
        adapter_wardrobe.notifyDataSetChanged();
    }









//---------------------------    커스텀 어댑터에서 뷰 만드는 부분.. ---------------------------------

public View getView(final int position, View convertView, ViewGroup parent) {
        //android:background="?android:attr/activatedBackgroundIndicator"  추가시 리스트뷰 선택
        // TODO Auto-generated method stub
        View v = convertView;
        final PersonViewHolder viewHolder;

        // 리스트 아이템이 새로 추가될 경우에는 v가 null값이다.
        // view는 어느 정도 생성된 뒤에는 재사용이 일어나기 때문에 효율을 위해서 해준다.
        if (v == null) {
            // inflater를 이용하여 사용할 레이아웃을 가져옵니다.
            v = ((LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                    .inflate(R.layout.custom_listview_wardrobe, null);

            viewHolder = new PersonViewHolder();

            // 레이아웃이 메모리에 올라왔기 때문에 이를 이용하여 포함된 뷰들을 참조할 수 있습니다.
            viewHolder.imgClothesIcon = (ImageView) v.findViewById(R.id.imageView_clothesicon_wardrobe);
            viewHolder.category = (TextView) v.findViewById(R.id.textView_category_wardrobe);
            viewHolder.clothes_name = (TextView) v.findViewById(R.id.textView_clothesname_wardrobe);
            viewHolder.season = (TextView) v.findViewById(R.id.textView_season_wardrobe);
            viewHolder.temp = (TextView) v.findViewById(R.id.textView_temp_wardrobe);
            viewHolder.weather = (TextView) v.findViewById(R.id.textView_weather_wardrobe);
            viewHolder.favor = (TextView) v.findViewById(R.id.textView_favor_wardrobe);
            viewHolder.checkbox_cart = (CheckBox) v.findViewById(R.id.checkbox_wardrobe);
            v.setTag(viewHolder);
        }
        else {
            viewHolder = (PersonViewHolder) v.getTag();
        }

        viewHolder.checkbox_cart.setChecked(isCheckedConfrim[position]);
        viewHolder.checkbox_cart.setFocusable(false);
        viewHolder.checkbox_cart.setClickable(false);


        v.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                viewHolder.checkbox_cart = (CheckBox) v.findViewById(R.id.checkbox_wardrobe);
                Log.i("Addpter_cart", "click Posion = " + position);
                setOpposition(position);
                viewHolder.checkbox_cart.setChecked(isCheckedConfrim[position]);
            }
        });



        // 받아온 position 값을 이용하여 배열에서 아이템을 가져온다.
        mUser = getItem(position);

        // 데이터의 실존 여부를 판별합니다.
        if (mUser != null) {
            // 데이터가 있다면 갖고 있는 정보를 뷰에 알맞게 배치시킵니다.
            if (mUser.getClothesIcon() != null) {
                try {
                    Bitmap image_bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), Uri.parse(mUser.getClothesIcon()));
                    viewHolder.imgClothesIcon.setImageBitmap(image_bitmap);

                    //Bitmap image_bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), Uri.parse(mUser.getClothesIcon()));
                    //Drawable d = new BitmapDrawable(image_bitmap);
                    //viewHolder.imgClothesIcon.setImageDrawable(d);

                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            viewHolder.category.setText(mUser.getCategory());
            viewHolder.clothes_name.setText(mUser.getClothesName());
            viewHolder.season.setText(mUser.getSeason());
            viewHolder.temp.setText(mUser.getTemp());
            viewHolder.weather.setText(mUser.getWeather());
            viewHolder.favor.setText(mUser.getFavor());
        }

        //checkbox_cart.setChecked(((ListView)parent).isItemChecked(position));
        return v;
    }


    public class PersonViewHolder {
        public ImageView imgClothesIcon;
        public TextView clothes_name;
        public TextView category;
        public TextView season;
        public TextView temp;
        public TextView weather;
        public TextView favor;
        public CheckBox checkbox_cart;
    }

//-------------------------------------------------------------------------------------------------

 

 

도움 부탁드리겠습니다.

긴 내용 읽어주셔서 감사합니다.

쓰구리 (220 포인트) 님이 2016년 4월 11일 질문

1개의 답변

0 추천
이미지를 매번 그런식으로 비트맵을 만드는것은 성능상 좋지 않습니다.

지금은 이미지 라이브러리들이 잘되어있는 것이 많으니

라이브러리를 활용해서 이미지를 보여주는것을 추천 합니다.

따로 캐시 관리를 할 필요도 없고 라이브러리에서 잘 처리해 주기 때문에 적당한 이미지 라이브러리를 찾아서 사용해보세요.

사용법도 간단하고 예제도 많기 때문에 하는것은 큰 어려움이 없을것 같습니다.

UIL - https://github.com/nostra13/Android-Universal-Image-Loader

picasso - http://square.github.io/picasso/

glide, - https://github.com/bumptech/glide

등등.. 좋은 라이브러리 들이 많이있습니다.
캬옹이 (37,920 포인트) 님이 2016년 4월 11일 답변
조언 감사합니다. 지금은 시간없어서 막 만들었지만 다음에 시간이 많다면 한번 라이브러리 써볼께요 ㅎㅎ

아 그리구 문제 해결했는데 매니페스트에 Read Stroage 권한이 없어서 그랬던 거였어요.
지금은 그 한줄 넣어서 해결했는데 혹시 안되시는분 매니페스트 확인 해 보시면 될것같네요.
...