一、单选.

        1.需求:ListView中各item中有一个CheckBox,点击个CheckBox记录item;如果已经记录,再次点击其他item,则之前记录的取消。
        2.代码部分:
        ①.方法一:
        通过WeakReference<View>软引用来并记录position来实现,软引用部分可以查看相关资料。思路主要是通过软引用来记录之前点击过得item所在的那个view里,然后在这个view里的CheckBox改变相应的状态。来实现消除界面中的UI选中item的效果。
        adapter中的核心代码:
 // 记录选中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);
        方法就可以了。
        方法一,因为存储了整个itemView,内存上的消耗比较大。
        ②方法二:
        不在使用WeakReference<View>、selectPosition,通过boolean[] b数值来实现单选。在初始还adapter的list时,给b赋值,在选中item的时候,给b[i]=true,其他为false,最后在getView里判断CheckBox是选中还是未选中。
核心代码:
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();
        在外面时,只要暴露数组b[]的get,set方法就可以了。方法二中,没有记录选的position,可以例外设置,也可以通过便利b[]来获取下标值来表示item位置

二、多选和全选.

        1.需求:购物车列表,多选商品和全选商品,并计算总价格。
        2.代码部分:
        全选按钮在listview外面,在adapter里必需有方法在外部调用。我当时做的时候是通过Map<Integer,Boolean>来记录选项的,后来发现这方法和单选中使用b[]数字来存位置是一样的,差别在于对java中数字和集合使用上的区别而且。需求中需要计算总价格,价格的显示是在外面的,这就涉及到adapter和activity通信的问题,而我使用的是fragment来使用这个adapter,所以我在adapter里定义了一个Fragment,(因为这个adapter这个项目中只有一个fragment调用,所以就没有考虑耦合性的问题。正确的方法应该是通过定义一个接口,然后让fragment或者activity去实现这个接口来实现总价格的计算)。
        adapter核心代码:
  // 用于在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. 问题:为命名空间,在此被用作类型和此项目作为引用添加将导致循环依赖项

    两个问题: 1.此项目作为引用添加将导致循环依赖项 说明你的两个项目中互相添加了引用.例如你再SQLTest中添加了Sineva.Entity,然后在Sineva.Entity中添加引用SQLTest ...

  2. Android ListView中 每一项都有不同的布局

    实现代码 Adapter的代码 其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局 TYPE_1...是三种类型. 在使用不同布局的时候,getItemViewTyp ...

  3. UWP ListView 绑定 单击 选中项 颜色

    UWP ListView 绑定 单击 选中项 颜色 xaml <Pagex:Class="SuperTools.Views.BlankPage3"xmlns="ht ...

  4. asp.net 将此项目作为引用添加将导致循环依赖项

    未能添加对"SystemFramework" 的引用.将此项目作为引用添加将导致循环依赖项. 避免该错误发生的方式: 1个工程里有A和B两个项目,在A里引用了B,在B里也引用了A就 ...

  5. 点击ListView中某一项,得到对应内容

    点击ListView中某一项,得到对应内容 先上效果图:(此处获取内容后用Toast显示) 下面是各部分代码 layout.xml(新建layout时直接把Root Tag设成ListView也可) ...

  6. ListView单选的实现总结(转)

    今天在智能停车场项目中需要实现PullToRefreshListView的单选功能,考虑到分页,刷新等,以前的实现方式是采用自己维护一个集合保存选中位置的选中状态,但这个方式比较繁琐,今天采用了lis ...

  7. 【Andorid X 项目笔记】禁用ListView的Fling功能(1)

    前言 新的项目正在紧张开发中,初步估计2个月时间开发完成第一版,我负责Android端开发,由于不便过早公布,本系列将命名为"X项目笔记",并于项目结束后最终公布名称.本系列主要记 ...

  8. wpf的listview编辑指定列_将项目添加到WPF ListView中的列

    小编典典 更少的XAML和更多的C#解决方案 如果您ListView在XAML中定义: 然后,您可以添加列并在C#中填充它: public Window() { // Initialize this. ...

  9. KTV项目之3个ListView的跳转和加载歌手图片

    第一个ListView: 第二个ListView: 第三个ListView: 定义一个KTVUtil类,在里面定义一个静态变量保存歌手图片 1 //定义一个静态变量保存歌手图片路径 2 public ...

最新文章

  1. linux中的rm 删除命令
  2. 如何更改自己电脑上的COM端口号
  3. TF之DCGAN:基于TF利用DCGAN测试MNIST数据集并进行生成过程全记录
  4. mysql 小数点后几位不足补0初始化
  5. Microsoft Asp.Net Ajax框架入门(12) 了解异步通信层
  6. Desktop: ERROR: Cannot set priority of namenode process 35122
  7. 吴晓波上市梦碎,罗永浩:梦太大又入错行
  8. 测试AS3的性能9800粒子
  9. 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
  10. 49多项式04——标准分解式、不可约多项式、因式分解及唯一性定理、重因式
  11. windows下解压xxx.war文件
  12. 如何用Smartbi做数据可视化分析图表
  13. [虚幻引擎] UE4/5数字孪生 制作城市光束效果
  14. 「京东白条」的数据架构进化之路
  15. 计算机excel没点保存,【2人回答】电脑突然断电,EXCEL没保存怎么找回已录入的资料?-3D溜溜网...
  16. 如何使用Nginx来实现企业微信域名校验
  17. 张一鸣带领5万人,做出多款头部产品的秘密是什么?
  18. db2数据库 为列加注释
  19. selenium实战-同步网易云音乐歌单到qq音乐
  20. JavaBean实例9:获取汉字的拼音简码

热门文章

  1. 三星Note3快速开启S Pen浮窗指令教程
  2. 没事的时候多看看书挺好
  3. jQuery 移除属性失败解决方法
  4. http 302重定向
  5. nvm管理本地Node版本(Windows)
  6. KBL406-ASEMI电脑适配器等高品质产品桥堆
  7. 2007年最值得一看的历史小说----玄鸟
  8. Kubernetes Dashboard集成Heapster
  9. 两因素促机构告别严寒迎暖春
  10. JavaScript取随机数