项目总结(FDL)(一)ListView单选和多项
一、单选.
// 记录选中item的位置,默认值为-1private static int selectPosition = -1;// 记录选中的itemView.private WeakReference<View> selectView;/*** get,set方法*/public WeakReference<View> getSelectView() {return selectView;}public void setSelectView(WeakReference<View> selectView) {this.selectView = selectView;}public int getSelectPosition() {return selectPosition;}public void setSelectPosition(int selectPosition) {this.selectPosition = selectPosition;}/.../adapter的通用方法//防止OOM清除记录下来的viewpublic void claerWeakReference() {if (getSelectView() != null) {getSelectView().clear();}}// 改变选这的item,public void changeSelectItem(int position, View view) {if (getSelectPosition() != -1) {// 在已经选中一个item的情况下。这就是selectView的作用,通过记录的上一个itemView来找到对应的CheckBox改变CheckBox的状态CheckBox cb_old = (CheckBox) selectView.get().findViewById(R.id.check_getads);cb_old.setChecked(false);}setSelected(position, view);}// 记录选中位置和view,记录下position和itemViewpublic void setSelected(int position, View view) {setSelectPosition(position);setSelectView(new WeakReference<View>(view));CheckBox cb = (CheckBox) view.findViewById(R.id.check_getads);cb.performClick();}public View getView(final int position, View convertView, ViewGroup parent) {/.../convertView初始化和复用// 判断当前item的位置是否为选中item的位置,解决converView复用过程中问题if (position != selectPosition) {holder.cb.setChecked(false);} else {holder.cb.setChecked(true);setSelectView(new WeakReference<View>(convertView));}}class ViewHolder{...}
至于选中的点击事件可以设置到adapter里面(cb.setOnClickListener,这是为了管理CheckBox的状态,所以用OnClickListener ),也可以设置到ListView的外面(lv.setOnItemClickListener).在监听事件调用adapter里的
Adapter.changeSelectiItem(position,view);
private boolean[] b;//因为我自定义adapter中,list是在new adapter之后添加进adapter里的,所以有另外写了一个添加list的方法
public void addDatas(List<Object> datas,boolean isClear){if(isClear){// 清空list,datas为adapter中的listthis.datas.clear();}this.datas.addAll(datas)
}
//public View getView(final int position, View convertView, ViewGroup parent) {/.../// 通过判断b[i]的值,来呈现item中CheckBox的状态,就可以不用考虑convertView的复用问题if(b[p]){holder.cb_setDefault.setChecked(true);}else{holder.cb_setDefault.setChecked(false);}
}class ViewHolder {/.../}
点击事件时,在里面在外面区别也不大,在点击事件里
for (int i = 0; i < dates.size(); i++) {if(position==i){b[i]=true;}else{b[i]=false;}}
//记得需要刷新listview,从而调用getView方法notifyDataSetChanged();
二、多选和全选.
// 用于在adapter中调用TextView更新总价格private CarFragment fragment;// 记录选中的itemprivate HashMap<Integer, Boolean> isSelected;// 总价格private double totalMoney;// 构造器public ShopCartAdapter(Context context, ShoppingCarFragment fragment) {super(context);isSelected = new HashMap<Integer, Boolean>();this.fragment = fragment;}// get,set方法public double getTotalMoney() {return totalMoney;}public void setTotalMoney(double totalMoney) {this.totalMoney = totalMoney;}public HashMap<Integer, Boolean> getIsSelected() {return isSelected;}public void setIsSelected(HashMap<Integer, Boolean> isSelected) {this.isSelected = isSelected;}// adapter 添加list的方法public void addDatas(List<ShopCartList.Cart> dates, boolean isclose) {// 此处我将添加list的方法抽出到抽象类MyBaseAdapter<T>中,然后继承MyBaseAdapter<T>super.addDatas(dates, isclose);// 在更新list数据时,同时更新记录的mapgetIsSelected().clear();iniDate();}// 初始化isSelected的状态public void iniDate() {for (int i = 0; i < getDatas().size(); i++) {getIsSelected().put(i, false);}}// 计算总价public double countTotalMoney() {Iterator<Map.Entry<Integer, Boolean>> iterator = getIsSelected().entrySet().iterator();double count = 0;while (iterator.hasNext()) {Map.Entry<Integer, Boolean> next = iterator.next();if (next.getValue()) {ShopCartList.Cart item = getItem(next.getKey());count += (Double.valueOf(item.getPrice()) * numberMap.get(next.getKey()));}}return count;}// 判断全选,用于改变外部全选CheckBox的状态public boolean isSelectAll() {boolean flag = true;Iterator<Map.Entry<Integer, Boolean>> iterator = getIsSelected().entrySet().iterator();StringBuffer buffer = new StringBuffer();while (iterator.hasNext()) {Map.Entry<Integer, Boolean> next = iterator.next();buffer.append(next.getKey() + ":" + next.getValue() + " ");if (!next.getValue()) {flag = false;}}return flag;}// 选择全部,在外部,点击全选时,调用此方法。public void selectedAll() {for (int i = 0; i < getDatas().size(); i++) {getIsSelected().put(i, true);}}// getView方法 @Overridepublic View getView(final int position, View convertView, ViewGroup parent) {/.../convertView和ViewHolder的初始化//点击该item的CheckBox时的监听holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {// 判断checkBox是否选中if(holder.cb.isChecked()){getisSelected().put(position,trus);}else{getisSelected().put(postiton,false);}// 没点击一次,都要判断所有的item是否都被选中if(isSelectAll){// fragment里的全选CheckBoxfragment.getCb_getAll().getChecked(true);}else{fragment.getCb_getAll().getChecked(false);}// 计算总价,fragment里用于显示价格的TextViewfragment.getTv_totalMoney().setText("¥" + countTotalMoney());});// itemUI中CheckBox的状态。holder.cb.setChecked(getIsSelected().get(position));}class ViewHolder{/.../}
cb_getAll.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {if (cb_getAll.isChecked()) {// 通过调用notifyDataSetChanged()来更新listview的UIadapter_cart.selectedAll();adapter_cart.notifyDataSetChanged();} else {adapter_cart.iniDate();adapter_cart.notifyDataSetChanged();}tv_totalMoney.setText("¥" + adapter_cart.countTotalMoney()); }});
项目总结(FDL)(一)ListView单选和多项相关推荐
- 问题:为命名空间,在此被用作类型和此项目作为引用添加将导致循环依赖项
两个问题: 1.此项目作为引用添加将导致循环依赖项 说明你的两个项目中互相添加了引用.例如你再SQLTest中添加了Sineva.Entity,然后在Sineva.Entity中添加引用SQLTest ...
- Android ListView中 每一项都有不同的布局
实现代码 Adapter的代码 其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局 TYPE_1...是三种类型. 在使用不同布局的时候,getItemViewTyp ...
- UWP ListView 绑定 单击 选中项 颜色
UWP ListView 绑定 单击 选中项 颜色 xaml <Pagex:Class="SuperTools.Views.BlankPage3"xmlns="ht ...
- asp.net 将此项目作为引用添加将导致循环依赖项
未能添加对"SystemFramework" 的引用.将此项目作为引用添加将导致循环依赖项. 避免该错误发生的方式: 1个工程里有A和B两个项目,在A里引用了B,在B里也引用了A就 ...
- 点击ListView中某一项,得到对应内容
点击ListView中某一项,得到对应内容 先上效果图:(此处获取内容后用Toast显示) 下面是各部分代码 layout.xml(新建layout时直接把Root Tag设成ListView也可) ...
- ListView单选的实现总结(转)
今天在智能停车场项目中需要实现PullToRefreshListView的单选功能,考虑到分页,刷新等,以前的实现方式是采用自己维护一个集合保存选中位置的选中状态,但这个方式比较繁琐,今天采用了lis ...
- 【Andorid X 项目笔记】禁用ListView的Fling功能(1)
前言 新的项目正在紧张开发中,初步估计2个月时间开发完成第一版,我负责Android端开发,由于不便过早公布,本系列将命名为"X项目笔记",并于项目结束后最终公布名称.本系列主要记 ...
- wpf的listview编辑指定列_将项目添加到WPF ListView中的列
小编典典 更少的XAML和更多的C#解决方案 如果您ListView在XAML中定义: 然后,您可以添加列并在C#中填充它: public Window() { // Initialize this. ...
- KTV项目之3个ListView的跳转和加载歌手图片
第一个ListView: 第二个ListView: 第三个ListView: 定义一个KTVUtil类,在里面定义一个静态变量保存歌手图片 1 //定义一个静态变量保存歌手图片路径 2 public ...
最新文章
- linux中的rm 删除命令
- 如何更改自己电脑上的COM端口号
- TF之DCGAN:基于TF利用DCGAN测试MNIST数据集并进行生成过程全记录
- mysql 小数点后几位不足补0初始化
- Microsoft Asp.Net Ajax框架入门(12) 了解异步通信层
- Desktop: ERROR: Cannot set priority of namenode process 35122
- 吴晓波上市梦碎,罗永浩:梦太大又入错行
- 测试AS3的性能9800粒子
- 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
- 49多项式04——标准分解式、不可约多项式、因式分解及唯一性定理、重因式
- windows下解压xxx.war文件
- 如何用Smartbi做数据可视化分析图表
- [虚幻引擎] UE4/5数字孪生 制作城市光束效果
- 「京东白条」的数据架构进化之路
- 计算机excel没点保存,【2人回答】电脑突然断电,EXCEL没保存怎么找回已录入的资料?-3D溜溜网...
- 如何使用Nginx来实现企业微信域名校验
- 张一鸣带领5万人,做出多款头部产品的秘密是什么?
- db2数据库 为列加注释
- selenium实战-同步网易云音乐歌单到qq音乐
- JavaBean实例9:获取汉字的拼音简码