
本文介绍了AndroID用RecyclerVIEw实现动态添加本地图片,分享给大家,具体如下:
本文所用的多图选择的library来自:https://github.com/lovetuzitong/MultiImageSelector
简单介绍一下用法:
1、跳转到图片选择页面:
Intent intent = new Intent(PassengerSetActivity.this,MultiImageSelectorActivity.class); intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA,true); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT,9); intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE,MultiImageSelectorActivity.MODE_SINGLE); startActivityForResult(intent,10001);//10001-->添加
2、通过onActivityResult获取信息:
final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESulT); Bitmap bitmap = BitmapFactory.decodefile(paths.get(0),DIY_dialog.getBitmapOption(4));
首先设置布局管理器为:
recyclervIEw.setLayoutManager(new GrIDLayoutManager(this,3));
然后设置适配器(这里在代码里面有详细的注释):
public class PassengerAdapter extends RecyclerVIEw.Adapter<PassengerAdapter.VIEwHolder> { private Context mContext; private OnItemClicklitener Listener;//点击事件接口 private ArrayList<String> imageUrls; private ImageFetcher imageFetcher; private VIEwHolder vIEwHolder; private VIEw vIEw; /** * 在构造方法中传入图片地址的数据 * @param context * @param imageUrls */ public PassengerAdapter(Context context,ArrayList<String> imageUrls) { this.mContext = context; this.imageUrls = imageUrls; //初始化加载网络图片的jar包 imageFetcher = new ImageFetcher(context); imageFetcher.setimageCache(ImageCache.getInstance(context)); } @OverrIDe public VIEwHolder onCreateVIEwHolder(VIEwGroup parent,int vIEwType) { vIEw = LayoutInflater.from(mContext).inflate(R.layout.lay_passager,null); vIEwHolder = new VIEwHolder(vIEw); return vIEwHolder; } @OverrIDe public voID onBindVIEwHolder(VIEwHolder holder,int position) { //设置内容为“hehe”的的元素为默认的添加按钮 if (imageUrls.get(position).equals("hehe")) { holder.imageVIEwBig.setBackgroundResource(R.mipmap.add); //当图片是添加按钮的时候隐藏删除按钮 holder.imageVIEwSmall.setVisibility(VIEw.GONE); } else { holder.imageVIEwSmall.setVisibility(VIEw.VISIBLE); /** * 判断图片路径是网络地址还是本地图片 * 设置路径之中包含“storage”的为本地图片 */ if (imageUrls.get(position).contains("storage")) { try { file file = new file(imageUrls.get(position)); //将bitmap转化成drawable Bitmap bmp = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(),Uri.fromfile(file)); Drawable drawable =new BitmapDrawable(bmp); //按比例扩大图片的size居中显示,使得图片长(宽)等于或大于VIEw的长(宽) holder.imageVIEwBig.setScaleType(ImageVIEw.ScaleType.CENTER_CROP); holder.imageVIEwBig.setimageBitmap(bmp); } catch (IOException e) { e.@R_301_1715@(); }// holder.imageVIEwBig.setimageURI(Uri.parse(imageUrls.get(position))); } else { imageFetcher.loadImage(imageUrls.get(position),holder.imageVIEwBig,R.mipmap.touxiang); } } } @OverrIDe public int getItemCount() { return imageUrls.size(); } public voID setonItemClicklitener(OnItemClicklitener Listener) { this.Listener = Listener; } public interface OnItemClicklitener { voID onBigClick(int position); voID onSmallClick(int position); } class VIEwHolder extends RecyclerVIEw.VIEwHolder { ImageVIEw imageVIEwBig,imageVIEwSmall; public VIEwHolder(VIEw itemVIEw) { super(itemVIEw); imageVIEwBig = (ImageVIEw) itemVIEw.findVIEwByID(R.ID.imageVIEwBig); imageVIEwSmall = (ImageVIEw) itemVIEw.findVIEwByID(R.ID.imageVIEwSmall); /** * * 因为元素是变化的,动态的,所以对点击事件的处理放在VIEwHolder类里面,调用getposition() * 可以获取到当前的元素位子 */ imageVIEwBig.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { int position = (Integer) v.getTag(); Listener.onBigClick(getposition()); } }); imageVIEwSmall.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { int position = (Integer) v.getTag(); Listener.onSmallClick(getposition()); } }); } }}recycler的布局文件
<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <FrameLayout androID:ID="@+ID/lay_group" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content"> <ImageVIEw androID:ID="@+ID/imageVIEwBig" androID:layout_wIDth="120dp" androID:layout_height="120dp" androID:background="@mipmap/background" /> <ImageVIEw androID:ID="@+ID/imageVIEwSmall" androID:layout_wIDth="20dp" androID:layout_height="20dp" androID:background="@mipmap/del" androID:layout_gravity="right"/> </FrameLayout></FrameLayout>
配置recyclervIEw和设置点击事件
recyclervIEw = (RecyclerVIEw) findVIEwByID(R.ID.recyclervIEw); recyclervIEw.setLayoutManager(new GrIDLayoutManager(this,3)); if(imageUrls.size()==0){ imageUrls.add("hehe"); } passengerAdapter = new PassengerAdapter(this,imageUrls); recyclervIEw.setAdapter(passengerAdapter); passengerAdapter.setonItemClicklitener(new PassengerAdapter.OnItemClicklitener() { @OverrIDe public voID onBigClick(int position) { Log.d(TAG,"onBigClick: "+passengerAdapter.getItemCount()); Log.d(TAG,"onBigClick: "+position); if (position==imageUrls.size()-1) { //添加本地相册图片,更新视图 Intent intent = new Intent(PassengerSetActivity.this,10001);//10001-->添加 } else { Intent intent = new Intent(PassengerSetActivity.this,MultiImageSelectorActivity.MODE_SINGLE); poss = position; startActivityForResult(intent,10002);//10002-->修改 //修改图片,更新视图 } } @OverrIDe public voID onSmallClick(int position) { imageUrls.remove(position); passengerAdapter.notifyItemRemoved(position); //删除图片,更新视图 } });选择完图片后,进行ui更新的 *** 作
/** * 返回图片url,并上传七牛 * * @param requestCode * @param resultCode * @param data */ @OverrIDe protected voID onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); if(data!=null){ if (requestCode == 10001 || requestCode == 10002) { final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESulT); Bitmap bitmap = BitmapFactory.decodefile(paths.get(0),DIY_dialog.getBitmapOption(4)); //添加图片 if (requestCode == 10001) { //将添加的图片放在第一位 imageUrls.add(0,paths.get(0)); //更新第一个位置的图片 passengerAdapter.notifyItemInserted(0); } //修改图片 else if (requestCode == 10002&&imageUrls.size()>0) { int pos = poss; imageUrls.set(pos,paths.get(0)); passengerAdapter.notifyItemChanged(pos); } } } }大概就是这样了,简单的说一下思路,就是在存储图片的List的最后一项添加一个具有不同标识的数据,当点击时对应的标识和该标识一致,则添加,反之为修改。使用recylervIEw可以直接更新有变化的子项,而不用更新全部子项,用户体验更好,性能也提高了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android用RecyclerView实现动态添加本地图片全部内容,希望文章能够帮你解决Android用RecyclerView实现动态添加本地图片所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)