2016-04-15 81 views
-3

我已经尝试了在这个网站上有的建议,他们不为我工作。我会尽力做到非常准确。我有一个自定义画廊,它在GridView中显示图像。用户可以从gridview中选择多个图像。点击Gridview位置后,会在该位置显示“Tick”图标以通知用户图像已被选中。问题是当我选择一个图像,并滚动选定图像上的“Ticked”图标出现在其他一些图像上。这里是代码。滚动时检查Gridview位置变化

public class CustomPhotoGalleryActivity extends Activity { 

private GridView grdImages; 
private Button btnSelect; 

private ImageAdapter imageAdapter; 
private String[] arrPath; 
private boolean[] thumbnailsselection; 
private int ids[]; 
private int count; 
private Cursor imagecursor = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.custom_gallery); 
    grdImages = (GridView) findViewById(R.id.grdImages); 
    btnSelect = (Button) findViewById(R.id.btnSelect); 
    final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID}; 
    final String orderBy = MediaStore.Images.Media._ID; 
    imagecursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); 
    int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID); 
    this.count = imagecursor.getCount(); 
    this.arrPath = new String[this.count]; 
    ids = new int[count]; 
    this.thumbnailsselection = new boolean[this.count]; 
    for (int i = 0; i < this.count; i++) { 
     imagecursor.moveToPosition(i); 
     ids[i] = imagecursor.getInt(image_column_index); 
     int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA); 
     arrPath[i] = imagecursor.getString(dataColumnIndex); 

     Log.e("arrPath", "" + arrPath[i]); 
    } 
    imageAdapter = new ImageAdapter(arrPath); 
    grdImages.setAdapter(imageAdapter); 

    btnSelect.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      final int len = thumbnailsselection.length; 
      int cnt = 0; 
      String selectImages = ""; 
      for (int i = 0; i < len; i++) { 
       if (thumbnailsselection[i]) { 
        cnt++; 
        selectImages = selectImages + arrPath[i] + "|"; 
       } 
      } 
      if (cnt == 0) { 
       Toast.makeText(getApplicationContext(), "Please select at least one image", Toast.LENGTH_LONG).show(); 
      } else { 

       Log.d("SelectedImages", selectImages); 
       Intent i = new Intent(); 
       i.putExtra("data", selectImages); 
       setResult(Activity.RESULT_OK, i); 
       finish(); 
      } 
     } 
    }); 
} 
public class ImageAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 
    private String[] arrPath; 

    public ImageAdapter(String[] arrPath) { 
     this.arrPath = arrPath; 
     mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getViewTypeCount() { 
     return arrPath.length; 
    } 


    public int getCount() { 
     return count; 
    } 

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

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View rootView = convertView; 
     final ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      rootView = mInflater.inflate(R.layout.custom_gallery_item, null); 
      holder.imgThumb = (ImageView) rootView.findViewById(R.id.imgThumb); 
      holder.chkImage = (ImageView) rootView.findViewById(R.id.chkImage); 
      rootView.setTag(holder); 
     } else { 
      holder = (ViewHolder) rootView.getTag(); 

     } 
     holder.chkImage.setId(position); 
     holder.imgThumb.setId(position); 
     holder.imgThumb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       int id = holder.chkImage.getId() 
       if (thumbnailsselection[id]) { 
        holder.chkImage.setVisibility(View.GONE); 
        thumbnailsselection[id] = false; 
       } else { 
        holder.chkImage.setVisibility(View.VISIBLE); 
        thumbnailsselection[id] = true; 
       } 
      } 
     }); 
     Picasso.with(CustomPhotoGalleryActivity.this) 
       .load(new File(arrPath[position])) 
       .resize(150, 150) 
       .centerCrop() 
       .into(holder.imgThumb); 
     return rootView; 
    } 
} 

class ViewHolder { 
    ImageView imgThumb; 
    ImageView chkImage; 
    int id; 
} 
} 

回答

1

做到这一点,它的工作对我来说,

public class CustomPhotoGalleryActivity extends Activity { 

private GridView grdImages; 
private Button btnSelect; 

private ImageAdapter imageAdapter; 
private String[] arrPath; 
private boolean[] thumbnailsselection; 
private int ids[]; 
private int count; 
private Cursor imagecursor = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.custom_gallery); 
    grdImages = (GridView) findViewById(R.id.grdImages); 
    btnSelect = (Button) findViewById(R.id.btnSelect); 
    final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID}; 
    final String orderBy = MediaStore.Images.Media._ID; 
    imagecursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy); 
    int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID); 
    this.count = imagecursor.getCount(); 
    this.arrPath = new String[this.count]; 
    ids = new int[count]; 
    this.thumbnailsselection = new boolean[this.count]; 
    ArrayList<Items> list=new ArrayList<>(); 
    for (int i = 0; i < this.count; i++) { 
     imagecursor.moveToPosition(i); 
     ids[i] = imagecursor.getInt(image_column_index); 
     int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA); 
     // arrPath[i] = imagecursor.getString(dataColumnIndex); 
     Items items=new Items(); 
     items.setChkImage(youResourceId); 
     items.setThumbImageUrl(imagecursor.getString(dataColumnIndex)); 
     items.setIsImageSelected(false); 
     list.add(items); 

     Log.e("arrPath", "" + arrPath[i]); 
    } 
    imageAdapter = new ImageAdapter(list); 
    grdImages.setAdapter(imageAdapter); 

    btnSelect.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      final int len = thumbnailsselection.length; 
      int cnt = 0; 
      String selectImages = ""; 
      for (int i = 0; i < len; i++) { 
       if (thumbnailsselection[i]) { 
        cnt++; 
        selectImages = selectImages + arrPath[i] + "|"; 
       } 
      } 
      if (cnt == 0) { 
       Toast.makeText(getApplicationContext(), "Please select at least one image", Toast.LENGTH_LONG).show(); 
      } else { 

       Log.d("SelectedImages", selectImages); 
       Intent i = new Intent(); 
       i.putExtra("data", selectImages); 
       setResult(Activity.RESULT_OK, i); 
       finish(); 
      } 
     } 
    }); 
} 
public class ImageAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 
    private String[] arrPath; 
    private ArrayList<Items> list; 

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

    @Override 
    public int getViewTypeCount() { 
     return arrPath.length; 
    } 


    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.custom_gallery_item, null); 
      holder.imgThumb = (ImageView) convertView.findViewById(R.id.imgThumb); 
      holder.chkImage = (ImageView) convertView.findViewById(R.id.chkImage); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 

     } 

     if(list.get(postion).isImageSelected()){ 
      holder.chkImage.setVisibility(View.VISIBLE); 
     }else{ 
      holder.chkImage.setVisibility(View.GONE); 
     }   

     holder.imgThumb.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       int id = holder.chkImage.getId() 
       if (list.get(postion).isImageSelected()) { 
        holder.chkImage.setVisibility(View.GONE); 
        list.get(postion).setIsImageSelected(false); 
       } else { 
        holder.chkImage.setVisibility(View.VISIBLE); 
        list.get(postion).setIsImageSelected(true); 
       } 
       notifyDataSetChanged(); 
      } 
     }); 
     Picasso.with(CustomPhotoGalleryActivity.this) 
       .load(list.get(position).getThumbImageUrl()) 
       .resize(150, 150) 
       .centerCrop() 
       .into(holder.imgThumb); 
     return convertView; 
    } 
} 

class ViewHolder { 
    ImageView imgThumb; 
    ImageView chkImage; 
    int id; 
} 
} 

public class Items { 


    int chkImage; 
    String thumbImageUrl; 
    boolean isImageSelected; 


    public int getChkImage() { 
     return chkImage; 
    } 

    public void setChkImage(int chkImage) { 
     this.chkImage = chkImage; 
    } 

    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; 
    } 
} 
+0

我尝试这样做。它不工作:( – AmeyaG

+0

你面临什么问题?? –

+0

假设我选择了gridview的第0个位置的图像,它会得到“Ticked”。当我自动向下滚动时,下面的几张图片也会得到勾号和第0个位置图像打勾较早得到unticked – AmeyaG