文档章节

购物车ListView中CheckBox的逻辑处理

Stepkim
 Stepkim
发布于 2016/04/26 10:45
字数 1022
阅读 58
收藏 0

最近在做一个项目,在做购物车的时候研究适配器内的CheckBox点击后Activity的数据更新,经过网上查找资料后问题解决,当然,也得感谢一下群里的大神提供了思路。

列表中的CheckBox选中状态与一个Map进行绑定,利用 adapter.notifyDataSetChanged();来更新界面。

至于当点击item中的CheckBox时,则调用了自定义的监听器来修改数据


Activity布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        style="@style/page_bg"
        android:paddingLeft="0dp"
        android:paddingRight="0dp" >

        <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >

            <ListView
                android:id="@+id/lv"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:choiceMode="multipleChoiceModal"
                android:scrollbars="none" />

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="@dimen/y44"
                android:layout_gravity="bottom"
                android:background="#FF111111"
                android:orientation="horizontal" >

                <CheckBox
                    android:id="@+id/check_all"
                    android:layout_width="@dimen/x64"
                    android:layout_height="wrap_content"
                    android:button="@drawable/checkbox_bg"
                    android:text="@string/check_all"
                    android:textColor="#FFcccccc"
                    android:layout_marginLeft="@dimen/layout_tpd"
                    android:textSize="@dimen/flayout_font" />

                <TextView
                    android:id="@+id/price"
                    android:layout_width="@dimen/x138"
                    android:layout_height="fill_parent"
                    android:gravity="center"
                    android:text="@string/total"
                    android:textColor="#FFcdcdcd"
                    android:textSize="@dimen/flayout_font" />

                <Button
                    android:id="@+id/balance"
                    android:layout_width="@dimen/x107"
                    android:layout_height="fill_parent"
                    android:layout_weight="1"
                    android:background="@drawable/btn_bg"
                    android:text="@string/balance"
                    android:textColor="@color/white"
                    android:textSize="@dimen/flayout_font" />
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>

</LinearLayout>


Adapter布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#FF333333"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="@dimen/y85"
        android:orientation="horizontal"
        android:paddingBottom="@dimen/layout_tpd"
        android:paddingLeft="@dimen/layout_lpd"
        android:paddingRight="@dimen/layout_lpd"
        android:paddingTop="@dimen/layout_tpd" >

        <CheckBox
            android:id="@+id/cb"
            style="@style/MyCheckBox"
            android:layout_width="@dimen/x21"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1" />
    </LinearLayout>

</LinearLayout>


TestAdapter.java
public class TestAdapter extends BaseAdapter {

	private Context mContext;
	// 填充数据的list
	private ArrayList<Map<String, String>> data;
	// 用来控制CheckBox的选中状况
	private static HashMap<Integer, Boolean> isSelected;

	private onCheckListener listener;

	public TestAdapter(Context mContext, ArrayList<Map<String, String>> data) {
		// TODO 自动生成的构造函数存根
		this.mContext = mContext;
		this.data = data;
		isSelected = new HashMap<Integer, Boolean>();
		for (int i = 0; i < data.size(); i++) {
			getIsSelected().put(i, false);
		}
	}

	@Override
	public int getCount() {
		// TODO 自动生成的方法存根
		return data.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO 自动生成的方法存根
		return data.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO 自动生成的方法存根
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		// TODO 自动生成的方法存根
		ViewHolder holder = null;
		if (convertView == null) {
			// 获得ViewHolder对象
			holder = new ViewHolder();
			// 导入布局并赋值给convertview
			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.adapter_test, null);
			holder.cb = (CheckBox) convertView.findViewById(R.id.cb);
			// 为view设置标签
			convertView.setTag(holder);
		} else {
			// 取出holder
			holder = (ViewHolder) convertView.getTag();
		}
		// 根据isSelected来设置checkbox的选中状况
		holder.cb.setChecked(getIsSelected().get(position));
		holder.cb.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO 自动生成的方法存根
				if (isSelected.get(position)) {
					isSelected.put(position, false);
					setIsSelected(isSelected);
				} else {
					isSelected.put(position, true);
					setIsSelected(isSelected);
				}
				listener.onCheck(isSelected);
			}
		});
		return convertView;
	}

	public static HashMap<Integer, Boolean> getIsSelected() {
		return isSelected;
	}

	public static void setIsSelected(HashMap<Integer, Boolean> isSelected) {
		TestAdapter.isSelected = isSelected;
	}

	public void setListener(onCheckListener listener) {
		this.listener = listener;
	}

	public interface onCheckListener {
		void onCheck(HashMap<Integer, Boolean> map);
	}

	public static class ViewHolder {
		CheckBox cb;
	}
}

TestActivity.java
public class TestActivity extends Activity implements OnClickListener, onCheckListener {

	private Button sc_balance;
	private CheckBox sc_check_all;
	private TextView sc_price;
	private ListView sc_lv;
	private TestAdapter testAdapter;
	private ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();
	private int checkNum = 0; // 记录选中的条目数量
	private float total = 0.00f;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO 自动生成的方法存根
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test);

		initView();
	}

	private void initView() {
		
		lv = (ListView) findViewById(R.id.lv);
		check_all = (CheckBox) findViewById(R.id.check_all);
		balance = (Button) findViewById(R.id.balance);
		price = (TextView) findViewById(R.id.price);

		Map<String, String> map = new HashMap<String, String>();
		map.put("price", "666");
		for(int i = 0;i < 20; i++){
		data.add(map);
		}
		
		testAdapter = new TestAdapter(getApplicationContext(), data);
		testAdapter.setListener(this);
		
		lv.setAdapter(testAdapter);
		check_all.setOnClickListener(this);
		dataChanged();
	}

	@Override
	public void onClick(View v) {
		// TODO 自动生成的方法存根
		switch (v.getId()) {
		case R.id.sc_check_all:
			// 全选
			total = 0.00f;
			if (check_all.isChecked() == true) {
				// 遍历list的长度,设为已选
				for (int i = 0; i < data.size(); i++) {
					testAdapter.getIsSelected().put(i, true);
					checkNum = data.size();
					total += Float.valueOf(data.get(i).get("price")
							.toString());
				}
				// 刷新listview和TextView的显示
				dataChanged();
			} else {
				// 遍历list的长度,设为未选
				for (int i = 0; i < data.size(); i++) {
					testAdapter.getIsSelected().put(i, false);
					checkNum--;// 数量减1
					total = 0.00f;
				}
				// 刷新listview和TextView的显示
				dataChanged();

			}
			break;
		default:
			break;
		}
	}

	// 刷新listview和TextView的显示
	private void dataChanged() {
		DecimalFormat decimalFormat = new DecimalFormat("0.00");// 构造方法的字符格式这里如果小数不足2位,会以0补足.
		String price_num = decimalFormat.format(total);// format 返回的是字符串
		String str = "合计" + "¥" + price_num + " ";
		// 通知listView刷新
		testAdapter.notifyDataSetChanged();
		// 用TextView显示
		balance.setText("结算(" + checkNum + ")");
		price.setText(str);
	}

	@Override
	public void onCheck(HashMap<Integer, Boolean> map) {
		// TODO 自动生成的方法存根
		total = 0.00f;
		checkNum = 0;
		for(int i = 0 ; i < map.size(); i ++){
			if (map.get(i)) {
				total += Float.valueOf(data.get(i).get("price").toString());
				checkNum ++;
			}
		}
		dataChanged();
	};
}


© 著作权归作者所有

Stepkim
粉丝 1
博文 19
码字总数 4416
作品 0
东莞
程序员
私信 提问
商城购物车加减控件的简单封装(续),解决ListView中数据错乱的问题

在上一篇文章中,我们学习了商城购物车加减控件的简单封装,知道了封装的思路过程和使用方法。还没有看过上一篇文章的朋友,建议先去阅读 商城购物车加减控件的简单封装 。这段时间收到一些小...

sinat_36668731
2017/08/17
0
0
Android开发之带CheckBox的ListView的点击事件的处理

在listView的子项中,如果存在checkbox控件,你会发现,你点击listView子项,不会有颜色电话,也不会有反应,因为checkbox会将焦点及点击事件抢走,及checkbox有更高的优先级 处理方法:将子...

Angels_安杰
2015/11/16
54
0
Android开发之ListView开发中view对象的复用问题2

需求:当你在复用listView的子项带有checkbox控件的view对象时,由于复用的原理是直接复用前面失去焦点的view对象(不懂得具体可看前面的一篇关于listView优化的记录http://my.oschina.net/z...

Angels_安杰
2015/11/16
541
0
android中如何获得listview中的checkbox的值?

大概情景:在做一个文件浏览器。listview显示所有的文件。如果是文件,点击打开。如果是文件夹,递归显示目录下的文件。 遇到的问题:通过listview和checkbox实现批量删除。checkbox初始状态...

苏谷子
2013/01/28
2.4K
4
Android ListView 使用

一.ListView点击变色 1.selector_text.xml listview——item中textview字体颜色改变 2.selector.xml listview——点击背景颜色改变 3.xml中设置 4.代码中设置 5.备注 android:state_selected...

SRain215
2016/03/16
164
0

没有更多内容

加载失败,请刷新页面

加载更多

带你了解 Java内存模型

Java内存模型的规定: 1、所有变量存储在主内存中; 2、每个线程都有自己的工作内存,且对变量的操作都是在工作内存中进行; 3、不同线程之间无法直接访问彼此工作内存中的变量,要想访问只能...

linux-tao
9分钟前
2
0
.net c# datetime转string 时间转字符串

.net c# datetime转string 时间转字符串 .net c# datetime转string 时间转字符串 刚开始接触net 时间转换字符串 一搜索出来的全是 字符串转时间,要么就是系统当前时间转字符串 就没有一个指...

青峰Jun19er
10分钟前
2
0
hbase demo

HbaseDao public class HbaseDao {@Testpublic void insertTest() throws Exception {Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.qu......

Garphy
20分钟前
2
0
IT兄弟连 HTML5教程 HTML5表单 多样的输入类型2

4 range range类型用于包含一定范围内数字值的输入域,跟number一样,我们还可以对数值设置限定,range类型显示为滑动条用法如下: 上述代码使用了range类型输入框,为该类型设置了数值范围为...

老码农的一亩三分地
20分钟前
2
0
对比不同的数据库连接的异同

博主在学习和使用数据库连接时,遇到的问题, 这个几个数据库连接究竟有什么不同? 到底什么时候该使用哪个会更好一点? 带着这个问题我们先去了解常见的数据库连接 1. 常见的数据库连接有哪些?...

理性思考
22分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部