【选择图片Jar】预览图片模块之M与C的实现(九)
来源:互联网 发布:西安交大网络公开课 编辑:程序博客网 时间:2024/05/16 09:27
1.前言
经过上一篇文章的铺垫,如果已经完全搞懂了,那么我们就可以开始进行我们本节的内容了!
本篇文章将带来,完整的Model的代码,以及对绝大部分的Controller的代码。
2.ChosenPhotoAdapter的实现
依旧,我们从构造方法开始看:
/** * 上下文 */ private Context mContext; /** * 图片路径 */ private List<String> mPaths; /** * 每行图片数量 -用于计算ImageView的大小 */ private int mNumColumns; /** * 添加图片的资源id */ private int mAddIconId; public ChosenPhotoAdapter(Context context, List<String> paths,int numColumns, int addIconId) { mContext = context; mNumColumns = numColumns;//每行图片显示的数量 mPaths = new ArrayList<String>(); mPaths.addAll(paths); //标记最后一位! mPaths.add(""); mAddIconId = addIconId;//+号图片的Id }
相信大家看了注释应该都能知道各个参数的意思。
需要特别注意的是 mNumColumns这个,这个我们主要是用来在getView()计算 ImageView宽高的!
然后我们在mPaths加入一个“”作为标记位。
接下来我们来看看核心的方法:getView()的代码:
if (convertView == null) { int screenWidth = ScreenUtil.getScreenWidth(mContext); //int screenHeight =ScreenUtil.getScreenHeight(mContext); // 计算图片的宽度 -目的是用来作为图片的高,保持图片方正,比较好看 int cWidth = screenWidth / mNumColumns; ImageView show = new ImageView(mContext); show.setLayoutParams(new ViewGroup.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, cWidth)); show.setScaleType(ScaleType.CENTER_CROP);} // 判断是不是最后一位,如果是最后一位则加载资源图片,不是路径if (position != mPaths.size() - 1) { ImageLoaderWrapper.loadFromFile((ImageView) convertView,mPaths.get(position));} else { ImageLoaderWrapper.loadFromDrawable((ImageView) convertView,mAddIconId);}return convertView;
相信这段代码也没有什么难理解的地方。
不过我稍微提及一下这里。
if (position != mPaths.size() - 1)
这个判断就是判断是否到了标记位的位置!
来看看最后一个方法update()
public void update(List<String> list) { if (mPaths == null) { mPaths = new ArrayList<String>(); } mPaths.clear(); mPaths.addAll(list); // 标记最后一位 mPaths.add(""); notifyDataSetChanged(); }
这里也是要处理一个标记位相信大家都能理解。
OK!那么Model的改造就到这里了!如果前面的文章都搞懂了,那么相信这里的逻辑也很清晰明了了!
接下来就看看Controller了!
3.ChosenPhotoViewController的实现
依旧从构造方法看起!
/** * 一行图片的数量 */ private int mNumColumuns; /** * +号图片的资源Id */ private int mAddIconId; } /** * 图片路径 */ private List<String> mPaths; private IPhotoGridView mView; private ChosenPhotoAdapter mAdapter; public ChosenPhotoViewController(int numColumns, int addIconId) { mAddIconId = addIconId; mNumColumuns = numColumns; }
相信很好理解。
我们来着重看看这个方法:
@Overridepublic void setPhotoViewListener(IPhotoGridView view) { mView = view; mAdapter = new ChosenPhotoAdapter(mView.getGridView().getContext(), mPaths, mNumColumuns, mAddIconId); mView.bindAdapter(mAdapter);}
我们知道,当我们的View调用了bindController之后,会自动调用对应Controller的setPhotoViewListener 代码如下:
public class GalleryGridView extends GridView implements IPhotoGridView, android.widget.AdapterView.OnItemClickListener { private BaseController mController; ....... public void bindController(BaseController controller) { mController = controller; mController.setPhotoViewListener(this); } .......}
那我们为何要在setPhotoViewListener里面创建Adapter呢?而不是在setAdapter的方法才创建呢?
这是因为,我们要默认显示出一个+号的图片啊! 所以我们要先创建Adapter!!
就是这个:
搞明白了这个就迈过了我们的第一道坎了! 那么我们现在来看看setAdapter的代码就很好理解啦!
@Overridepublic void setAdapter(List<String> paths) { if (mView == null) throw new IllegalArgumentException( "mListener is null. you should invoke ChosenPhotoGridView's bindController() first"); mPaths = paths; mAdapter.update(mPaths);}
那还剩下一个最困难的方法了! 我们需要单独拿出来好好讲一下!
4.Click中的逻辑处理
我们来看看click逻辑处理的框架长什么样子:
@Override public void click(int position) { //注意这个是 mPaths.size() 不是 mPaths.size()-1 if (position == mPaths.size()) { //跳转选择图片页面 } else { //显示详情页面 } }
需要单独把这段代码拿出来讲讲:
if (position == mPaths.size())
还记得我们在Adapter中设置多了一个“”的标记位吧?那这个标记位是第几个位置呢? 这个需要思考一下哦,反应过来了就知道我这里判断的意思了!
那接下来我们来实现具体的逻辑了。
首先是+号图片的点击事件的处理,也就是这段代码:
if (position == mPaths.size()) { //跳转选择图片页面 //我们要在这里写.....}else{}
首先我们这里要进行页面的跳转,也就是要跳转到选择图片的那个Activity。
是我们这个是Jar包啊! 不能够知道具体项目中要跳转到的目标的Activity,那我们怎知道呢?
答案是:我们不知道! 哈哈~那我们怎么办?相信有的同学已经知道了,我们可以接口回调啊!具体的逻辑让使用Jar的人来处理啊!
没错了 就是这个!
那代码就变成了:
/** * +号图片,接口回调 */ private AddIconAction mAction; @Override public void click(int position) { if (position == mPaths.size()) { //跳转选择图片页面 逻辑用接口回调让外部处理! if (mAction == null) { throw new IllegalArgumentException( "AddIconAction is null. you should invoke setAddIconAction first"); } mAction.onAddClick(); } else { //跳转到详情页面 } } public void setAddIconAction(AddIconAction action) { mAction = action; } public interface AddIconAction { void onAddClick(); }
这样只是不是就比较好地处理了这个尴尬的事件了呢?
那么我们现在来看看“跳转到详情页面“这个逻辑。 有的同学可能就说了,我知道,这里还是用接口回调,因为我们需要跳转到另外一个Activity去展示我们的图片!
诚然,这是一个方法,但未必是一个好方法。 因为我们想想,我们这是一个Jar包,是为了抽取公用模块,达到快速开发的目的。那如果再次使用接口回调,跳转页面,岂不是我们又要编写多一个新的Activity?这个Activity要包括我们上面的Bar还有 ViewPager,然后还要编写一大堆的逻辑处理代码。NONONO,这不是我们所需要的!
那怎么办?
5.结束语
我们留一个悬念,我们到底要如何解决这个问题?希望都可以开动一下自己的脑袋瓜,思考一下!
我一直认为”授人以鱼,不如授人以渔“。唯有我们开动脑经,才能发现更多的实现方法!
这个悬念将在下篇文章揭晓! 如果有答案的同学,也可以在下面评论踊跃发表一下自己的见解!
- 【选择图片Jar】预览图片模块之M与C的实现(九)
- 【选择图片Jar】完成选择图片后:预览图片的实现(八)
- 【选择图片Jar】全屏DialogFragment实现图片详情预览(十)
- 【选择图片Jar】Adapter的实现之SparseBooleanArray图片状态管理器(二)
- 【选择图片Jar】“MVC“来实现逻辑处理与View视图的分离(五)
- Django之处理选择预览图片
- input选择图片 预览图片
- 文件、图片的上传并实现图片预览(二)
- 图片上传预览的实现
- Canvas实现图片的预览
- 支持图片预览的文件选择对话框
- JFileChooser ,让你的图片选择可以预览图片内容
- 解决C:\fakepath路径加密问题,图片上传之前的预览功能的实现,html5 实现图片预览功能
- 【选择图片Jar】Adapter的item布局的实现(三)
- html5图片上传与预览实现
- ife系列之实现图片上传预览
- 微信jsapi开发教程之微信jsapi选择图片,上传图片,预览和下载图片(第六课)
- 上传图片,实现图片预览
- 步进电机控制之控制精度讨论
- Android Training 的整理和总结
- ZOJ-2849-Attack of Panda Virus【bfs】【优先级队列】【4th浙江省赛】【好题】
- BitmapFactory.decodeStream 内存溢出java.lang.OutOfMemoryError
- IOS图片拖拽.旋转.缩放
- 【选择图片Jar】预览图片模块之M与C的实现(九)
- 微信抢红包神器-安卓专享。再也不会错过红包了
- hdu 2156 分数矩阵
- 微软编程题:寻找最小的k个值
- Java 并发:Executors 和线程池
- c#之params参数
- bzoj1305 [CQOI2009]dance跳舞 最大流 二分
- jdk与jre的区别
- 《魔灵保卫者》服务端架构及实现