项目总结(FDL)(一)ListView单选和多项
一、单选.
1.需求:ListView中各item中有一个CheckBox,点击个CheckBox记录item;如果已经记录,再次点击其他item,则之前记录的取消。 2.代码部分:①.方法一: 通过WeakReference
// 记录选中item的位置,默认值为-1private static int selectPosition = -1;// 记录选中的itemView.private WeakReference selectView;/*** get,set方法*/public WeakReference getSelectView() {return selectView;}public void setSelectView(WeakReference 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));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(convertView));}}class ViewHolder{...} 至于选中的点击事件可以设置到adapter里面(cb.setOnClickListener,这是为了管理CheckBox的状态,所以用OnClickListener ),也可以设置到ListView的外面(lv.setOnItemClickListener).在监听事件调用adapter里的
Adapter.changeSelectiItem(position,view);
方法就可以了。
方法一,因为存储了整个itemView,内存上的消耗比较大。
②方法二:
不在使用WeakReferenceprivate boolean[] b;//因为我自定义adapter中,list是在new adapter之后添加进adapter里的,所以有另外写了一个添加list的方法
public void addDatas(List 点击事件时,在里面在外面区别也不大,在点击事件里 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 // 用于在adapter中调用TextView更新总价格private CarFragment fragment;// 记录选中的itemprivate HashMap isSelected;// 总价格private double totalMoney;// 构造器public ShopCartAdapter(Context context, ShoppingCarFragment fragment) {super(context);isSelected = new HashMap();this.fragment = fragment;}// get,set方法public double getTotalMoney() {return totalMoney;}public void setTotalMoney(double totalMoney) {this.totalMoney = totalMoney;}public HashMap getIsSelected() {return isSelected;}public void setIsSelected(HashMap isSelected) {this.isSelected = isSelected;}// adapter 添加list的方法public void addDatas(List dates, boolean isclose) {// 此处我将添加list的方法抽出到抽象类MyBaseAdapter中,然后继承MyBaseAdaptersuper.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> iterator = getIsSelected().entrySet().iterator();double count = 0;while (iterator.hasNext()) {Map.Entry 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> iterator = getIsSelected().entrySet().iterator();StringBuffer buffer = new StringBuffer();while (iterator.hasNext()) {Map.Entry 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()); }}); 本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
