前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承baseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲!
一. 实现效果
主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看,不足之处在于+好没有移动至最后,但原理相同.
二. 项目工程结构
三. 界面布局详细代码
1.主界面activity_main.xml
主要通过相对布局实现,第一部分是底部的TextView,中间是EditView和GridView相对布局,下面是两个按钮.同时EditView调用res/drawable-hdpi中的editview_shape.xml,GridView显示的每张图片通过griditem_addpic.xml实现.
2.显示ImageView图片布局griditem_addpic.xml
3.设置EditView控件圆角和颜色 editview_shape.xml
四. 代码详解
它主要是思想如下:
1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setonItemClickListener()点击函数中响应不同操作.
2.当点击加号图片(+)时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage.
3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片.
4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除.
具体代码如下所示:
public class MainActivity extends Activity { private GridView gridView1;//网格显示缩略图 private Button buttonPublish; //发布按钮 private final int IMAGE_OPEN = 1; //打开图片标记 private String pathImage; //选择图片路径 private Bitmap bmp; //导入临时图片 private ArrayList> imageItem; private SimpleAdapter simpleAdapter; //适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_ADJUST_PAN); //锁定屏幕 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); //获取控件对象 gridView1 = (GridView) findViewById(R.id.gridView1); //获取资源图片加号 bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gridview_addpic); imageItem = new ArrayList >(); HashMap map = new HashMap (); map.put("itemImage", bmp); imageItem.add(map); simpleAdapter = new SimpleAdapter(this, imageItem, R.layout.griditem_addpic, new String[] { "itemImage"}, new int[] { R.id.imageView1}); simpleAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView1.setAdapter(simpleAdapter); gridView1.setonItemClickListener(new onItemClickListener() { @Override public void onItemClick(AdapterView> parent, View v, int position, long id) { if( imageItem.size() == 10) { //第一张为默认图片 Toast.makeText(MainActivity.this, "图片数9张已满", Toast.LENGTH_SHORT).show(); } else if(position == 0) { //点击图片位置为+ 0对应0张图片 Toast.makeText(MainActivity.this, "添加图片", Toast.LENGTH_SHORT).show(); //选择图片 Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, IMAGE_OPEN); //通过onResume()刷新数据 } else { dialog(position); //Toast.makeText(MainActivity.this, "点击第"+(position + 1)+" 号图片", // Toast.LENGTH_SHORT).show(); } } }); } //获取图片路径 响应startActivityForResult protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //打开图片 if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) { Uri uri = data.getData(); if (!TextUtils.isEmpty(uri.getAuthority())) { //查询选择图片 Cursor cursor = getContentResolver().query( uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null); //返回 没找到选择图片 if (null == cursor) { return; } //光标移动至开头 获取图片路径 cursor.moveToFirst(); pathImage = cursor.getString(cursor .getColumnIndex(MediaStore.Images.Media.DATA)); } } //end if 打开图片 } //刷新图片 @Override protected void onResume() { super.onResume(); if(!TextUtils.isEmpty(pathImage)){ Bitmap addbmp=BitmapFactory.decodeFile(pathImage); HashMap map = new HashMap (); map.put("itemImage", addbmp); imageItem.add(map); simpleAdapter = new SimpleAdapter(this, imageItem, R.layout.griditem_addpic, new String[] { "itemImage"}, new int[] { R.id.imageView1}); simpleAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Object data, String textRepresentation) { // TODO Auto-generated method stub if(view instanceof ImageView && data instanceof Bitmap){ ImageView i = (ImageView)view; i.setImageBitmap((Bitmap) data); return true; } return false; } }); gridView1.setAdapter(simpleAdapter); simpleAdapter.notifyDataSetChanged(); //刷新后释放防止手机休眠后自动添加 pathImage = null; } } protected void dialog(final int position) { alertDialog.Builder builder = new Builder(MainActivity.this); builder.setMessage("确认移除已添加图片吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new DialogInterface.onClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); imageItem.remove(position); simpleAdapter.notifyDataSetChanged(); } }); builder.setNegativeButton("取消", new DialogInterface.onClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }
同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.
五. 总结
该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示.
这时有两种解决方法,一种是自定义继承baseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法.
demo下载地址:http://xiazai.jb51.net/201701/yuanma/GirdViewTest_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。