2

i am showing and hiding checkbox on imageview click in gridview but when i click on one imageView checkbox appear on multiple image view android and as i scroll visible checkbox goes missing when i scroll here is my Adapter

     public class ImageAdapter extends BaseAdapter {
        private LayoutInflater mInflater;

        public ImageAdapter() {
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }



        public int getCount() {
            return arrPath.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(
                        R.layout.galleryitems, parent,false);
                holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);
                holder.checkbox = (CheckBox) convertView.findViewById(R.id.itemCheckBox);
                convertView.setTag(R.id.itemCheckBox, holder.checkbox);
                convertView.setTag(R.id.thumbImage,holder.imageview);
                convertView.setTag(holder);




            } else {
                holder = (ViewHolder) convertView.getTag();
                holder.checkbox = (CheckBox)convertView.getTag();
                holder.imageview = (ImageView)convertView.getTag();
            }
            holder.checkbox.setId(position);
            holder.imageview.setId(position);
            holder.checkbox.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    CheckBox cb = (CheckBox) v;
                    int id = cb.getId();


                    if (thumbnailsselection[id]) {
                        cb.setChecked(false);
                        thumbnailsselection[id] = false;
                    } else {
                        cb.setChecked(true);
                        thumbnailsselection[id] = true;
                    }
                }
            });
            holder.imageview.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    ImageView iv = (ImageView )v;
                    int id = iv.getId();
                    if (holder.checkbox.getVisibility() == View.GONE) {

                            holder.checkbox.getTag();
                            holder.imageview.getTag();
                            holder.imageview.setAlpha(0.22f);
                            holder.checkbox.setVisibility(View.VISIBLE);
                            holder.checkbox.setChecked(true);


                    } else if (holder.checkbox.getVisibility() == View.VISIBLE) {
                        holder.imageview.setAlpha(0.8f);
                        holder.checkbox.setVisibility(View.GONE);
                    }



                }
            });
            holder.checkbox.setTag(position);
            holder.imageview.setImageBitmap(thumbnails[position]);
            holder.checkbox.setChecked(thumbnailsselection[position]);
            holder.id = position;
            return convertView;
        }
 }

    class ViewHolder {
        ImageView imageview;
        CheckBox checkbox;
        int id;
    }
}
Nongthonbam Tonthoi
  • 12,667
  • 7
  • 37
  • 64
bambi
  • 33
  • 8
  • i tried this code not helping Override public int getViewTypeCount() { // TODO Auto-generated method stub if (arrPath != null) return arrPath.length; else return 0; } @Override public int getItemViewType(int position) { // TODO Auto-generated method stub return 0; } – bambi Apr 15 '16 at 05:48
  • just another "view holder" pattern problem? in 99% of cases view holder pattern is useless and only causes headache – pskink Apr 15 '16 at 06:00

2 Answers2

1

try this code it worked for me,

public class ImageAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private ArrayList<Items> list
        public ImageAdapter(ArrayList<Items> list) {
            this.list=list;
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }



        public int getCount() {
            return list.size();
        }

        public Items getItem(int position) {
            return list.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(
                        R.layout.galleryitems, parent,false);
                holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage);
            //Take image view in your XML       
                holder.checkbox = (ImageView) convertView.findViewById(R.id.itemCheckBox);

                convertView.setTag(holder);




            } else {
                holder = (ViewHolder) convertView.getTag();

            }

            if(list.get(position).isImageSelected()){
                 // set your check image 
                 holder.checkbox.setImageResource(checkResId);
            }else{
                 // set your Uncheck image 
                 holder.checkbox.setImageResource(unCheckResId);
            }

            holder.checkbox.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {



                    if(list.get(position).isImageSelected()){
                       // set your Uncheck image 
                        holder.checkbox.setImageResource(unCheckResId);
                        list.get(position).setIsImageSelected(false);
                    } else {
                        // set your check image 
                         holder.checkbox.setImageResource(checkResId); 
                        list.get(position).setIsImageSelected(false);
                    }
                  notifyDataSetChanged();
                }
            });

            return convertView;
        }
 }

    class ViewHolder {
        ImageView imageview;
        // Use ImageView for select and deselect
        ImageView checkbox;
        int id;
    }
}

public class Items {



    String thumbImageUrl;
    boolean isImageSelected;



    public String getThumbImageUrl() {
        return thumbImageUrl;
    }

    public void setThumbImageUrl(String thumbImageUrl) {
        this.thumbImageUrl = thumbImageUrl;
    }

    public boolean isImageSelected() {
        return isImageSelected;
    }

    public void setIsImageSelected(boolean isImageSelected) {
        this.isImageSelected = isImageSelected;
    }
}
Pradeep Gupta
  • 1,770
  • 1
  • 9
  • 23
0

that's not how you use ViewHolder dude. ViewHolder will also be reused like convertView as you set them as the tag. It was supposed to link the UI, so that you don't need to call findViewById again. But is your responsibility to maintain the data( the position of ImageView you selected in your case)

see this as an example.

Community
  • 1
  • 1
ytinrete
  • 46
  • 6