在GridView里添加一个功能按钮
2015-07-31 17:25
369 查看
标题描述的不是特别清楚,其实最直接明了的就是看一张图
在这幅图里,主要的布局就是一个GridView组件,拍摄照片是个相当于一个按钮的组件,然后其他的内容都是一张张图片,如果单独为了添加一个按钮而自定义个组件,那么是很费劲的!
正常情况下,使用GridView,效果是这样的‘
如果实现和微信界面类似的效果,怎么办呢?
主要修改点在GridView的BaseAdapter里,修改它就能实现微信的效果了。其它部分就不着重说明了,主要说明这个BaseAdapter
首先需要思考,GridView的数据能否变化?如果需要实现成微信效果,必须是改变数据的。如果在getView的方法里添加数据,
即
但是如果真是这么写的话,会有问题的,数据每次更新,每次都会添加,所以这么做是错的,getView()里不能添加数据,但是可以在getView里处理点击事件,比如下面的代码:
那么数据在哪里添加呢?可以在下面添加:
其实插入数据集合的第一个数据是空的或者是无效的数据,因为没有用处,只是起了填充作用。这么做就可以 实现微信的那种效果了,
在GridView里添加个另类数据。这只是一个思想,写的比较乱,如果这个想法不好,希望能指正一下,谢谢哈
今天发现之前写的这篇文章有些问题,多个页面滑动时VIew组件会乱掉!这是个比较明显的问题,现在才发现,非常抱歉!
上面的问题主要集中在:public View getView(int position, View convertView, ViewGroup parent) 这个方法里,同时参考文章:/article/7833585.html
进行优化View的组合
不过ListView和GridView在使用getVIew方法里是有些区别的。下面是GridView 的getView方法部分参考代码:
也就是,在使用缓存技术时,先要判定当前使用缓存的View是按钮还是图片,如果数据是图片而View是按钮,一定要重新加载此时的VIew,不能使用缓存
在这幅图里,主要的布局就是一个GridView组件,拍摄照片是个相当于一个按钮的组件,然后其他的内容都是一张张图片,如果单独为了添加一个按钮而自定义个组件,那么是很费劲的!
正常情况下,使用GridView,效果是这样的‘
如果实现和微信界面类似的效果,怎么办呢?
主要修改点在GridView的BaseAdapter里,修改它就能实现微信的效果了。其它部分就不着重说明了,主要说明这个BaseAdapter
首先需要思考,GridView的数据能否变化?如果需要实现成微信效果,必须是改变数据的。如果在getView的方法里添加数据,
即
if (position==0){ List.add(0,Data); }
但是如果真是这么写的话,会有问题的,数据每次更新,每次都会添加,所以这么做是错的,getView()里不能添加数据,但是可以在getView里处理点击事件,比如下面的代码:
@Override public View getView(int position, View convertView, ViewGroup parent) { PhotoItem item = null; if (convertView == null || !(convertView instanceof PhotoItem)) { item = new PhotoItem(context, listener); item.setLayoutParams(itemLayoutParams); convertView = item; } else { item = (PhotoItem) convertView; } if (position==0){ item.initSetting(isShowCamera); item.setCameraPhoto(R.drawable.camerashow); item.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); CommonUtils.launchActivityForResult((Activity)context, intent, 1); } }); }else { item.initSetting(false); item.setImageDrawable(models.get(position)); item.setSelected(models.get(position).isChecked()); item.setOnClickListener(mCallback, position); } return convertView; }
那么数据在哪里添加呢?可以在下面添加:
@Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); if (isShowCamera){ PhotoModel cameraModule=new PhotoModel(); cameraModule.setOriginalPath("cameraModule"); models.add(0,cameraModule); } }
其实插入数据集合的第一个数据是空的或者是无效的数据,因为没有用处,只是起了填充作用。这么做就可以 实现微信的那种效果了,
在GridView里添加个另类数据。这只是一个思想,写的比较乱,如果这个想法不好,希望能指正一下,谢谢哈
今天发现之前写的这篇文章有些问题,多个页面滑动时VIew组件会乱掉!这是个比较明显的问题,现在才发现,非常抱歉!
上面的问题主要集中在:public View getView(int position, View convertView, ViewGroup parent) 这个方法里,同时参考文章:/article/7833585.html
进行优化View的组合
不过ListView和GridView在使用getVIew方法里是有些区别的。下面是GridView 的getView方法部分参考代码:
@Override public View getView(final int position, View convertView, ViewGroup parent) { Holder holder = null; AddHolder addHolder = null; int type = getItemViewType(position); if (convertView == null) { if (type == 1) { convertView = LayoutInflater.from(mContext).inflate(R.layout.view_takecamera, null); addHolder = new AddHolder(); addHolder.addImage = (ImageView)convertView.findViewById(R.id.btn_camera); convertView.setTag(addHolder); } else { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_grid_img, null); holder = new Holder(); holder.imageView = (ImageView)convertView.findViewById(R.id.item_img); holder.img_del = (ImageView)convertView.findViewById(R.id.item_del); convertView.setTag(holder); } } else { if (type == 1) { if (convertView.getTag() instanceof Holder) { convertView = LayoutInflater.from(mContext).inflate(R.layout.view_takecamera, null); addHolder = new AddHolder(); addHolder.addImage = (ImageView)convertView.findViewById(R.id.btn_camera); convertView.setTag(addHolder); } else { addHolder = (AddHolder)convertView.getTag(); } addHolder.addImage .setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height)); } else { if (convertView.getTag() instanceof AddHolder) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_grid_img, null); holder = new Holder(); holder.imageView = (ImageView)convertView.findViewById(R.id.item_img); holder.img_del = (ImageView)convertView.findViewById(R.id.item_del); convertView.setTag(holder); } else { holder = (Holder)convertView.getTag(); } } } …… }
也就是,在使用缓存技术时,先要判定当前使用缓存的View是按钮还是图片,如果数据是图片而View是按钮,一定要重新加载此时的VIew,不能使用缓存
相关文章推荐
- CSU_1640_机智的刷题方式
- Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印
- Android远程服务二:Android 中的 Service 全面总结
- JS设置多选框处于选中状态
- Voice over IP
- 【C++ STL】算法 <algorithm>中各种算法解析
- SHELL学习
- MQ、JMS以及ActiveMQ 关系的理解
- Redis——事务&持久化
- EXE和SYS通信(ReadFile WriteFile DO_DIRECT_IO) 直接方式
- Deep Learning for Nature Language Processing --- 第七讲
- linux安装mysql、tomcat和jdk1.7、Android Studio
- Uediter的引用和取值
- Memcached命令:简单获取缓存value用法
- 利用HTML5分片上传超大文件
- MyEclipse10 离线图文安装SVN插件教程
- tomcat一些参数的理解
- ubuntu varnish 安装
- 目前宽带的接入方式有哪些
- markDown语法