如何将GridView中点击的图片传递到自定义AlertDialog中
解决GridView点击后Dialog展示对应图片的问题
这个问题其实很容易搞定,核心就是你需要把GridView每个位置对应的图片资源ID和点击的position关联起来——现在你是硬编码了固定的图片ID,所以不管点哪张都是同一张图。我给你一步步说怎么改:
第一步:定义统一的图片资源数组
首先在你的GalleryActivity里,创建一个存储所有GridView图片资源ID的数组,顺序必须和GridView展示的图片顺序完全一致:
// 把你GridView里用到的所有图片资源ID按顺序填在这里 private int[] gridImageResources = { R.drawable.webgallery_1, R.drawable.webgallery_2, R.drawable.webgallery_3, // 继续添加剩下的图片ID,确保和GridView显示顺序对应 };
第二步:让你的ImageAdapter复用这个数组
如果你的ImageAdapter还没基于这个数组构建,就把它改成这样(保证Adapter和Activity用同一套数据源):
public class ImageAdapter extends BaseAdapter { private Context mContext; private int[] mImageResources; // 构造方法接收图片资源数组 public ImageAdapter(Context context, int[] imageResources) { mContext = context; mImageResources = imageResources; } @Override public int getCount() { return mImageResources.length; } @Override public Object getItem(int position) { return mImageResources[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); // 根据你的需求调整GridView项的布局参数 imageView.setLayoutParams(new GridView.LayoutParams(200, 200)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); } else { imageView = (ImageView) convertView; } // 从数组中取对应position的图片 imageView.setImageResource(mImageResources[position]); return imageView; } // 可选:给Activity提供获取对应position图片ID的方法,解耦性更好 public int getImageResource(int position) { if (position >= 0 && position < mImageResources.length) { return mImageResources[position]; } return -1; } }
第三步:修改Activity的初始化代码
在onCreate里初始化Adapter时,把刚才定义的数组传进去:
private ImageAdapter mImageAdapter; // 保存Adapter引用,方便后续调用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gallery); GridView gridview = (GridView) findViewById(R.id.gridview); mImageAdapter = new ImageAdapter(this, gridImageResources); gridview.setAdapter(mImageAdapter); gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { loadPhoto(position); } }); }
第四步:修改loadPhoto方法,动态设置图片
把之前硬编码的R.drawable.webgallery_1换成根据position获取的图片ID:
private void loadPhoto(int position) { AlertDialog.Builder imageDialog = new AlertDialog.Builder(this); LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); final View view = inflater.inflate(R.layout.custom_fullimage_dialog, null); ImageView image = (ImageView) view.findViewById(R.id.fullimage); // 关键修改:根据position获取对应图片资源ID int targetImageId = mImageAdapter.getImageResource(position); if (targetImageId != -1) { image.setImageResource(targetImageId); } imageDialog.setView(view); imageDialog.setPositiveButton(R.string.label_ok, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); imageDialog.create(); imageDialog.show(); }
这样修改后,点击GridView里的任意图片,Dialog都会展示对应的那张图了~
内容的提问来源于stack exchange,提问作者Will Buffington
相关产品推荐
相关产品推荐

