这里提供一下实现购物车全选,反选,结算的思路
为了解决ListView滑动时,checkBox不会错乱,写一个集合,装载checkBox状态
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.shopfragment, container, false);
//初始化事件
initView();
//从数据库查询数据
getData();
//根据商品个数判断加载的布局
if (dataList.size() == 0) {
//数据库中没有东西,显示空的界面
empty_linear.setVisibility(View.VISIBLE);
shopcart_have.setVisibility(View.GONE);
} else {
empty_linear.setVisibility(View.GONE);
shopcart_have.setVisibility(View.VISIBLE);
}
//加载数据,适配显示
initData();
//初始化事件
initEvent();
return view;
}
/**
* 初始化界面
*/
private void initView() {
num = (TextView) view.findViewById(R.id.shopcart_num);
editor = (TextView) view.findViewById(R.id.shopcart_edit);
allCheck = (CheckBox) view.findViewById(R.id.allcheck_img);
total_price = (TextView) view.findViewById(R.id.total_tv);
total_btn = (Button) view.findViewById(R.id.total_btn);
listView = (ListView) view.findViewById(R.id.shopcart_lv);
empty_linear = (LinearLayout) view.findViewById(R.id.empty_linear);
shopcart_have = (LinearLayout) view.findViewById(R.id.shopcart_have);
btn_gyg = (Button) view.findViewById(R.id.btnshopping_gyg);
}
/**
* 数据库查询数据,并初始化集合
*/
private void getData() {
ShopDao dao = new ShopDao(getContext());
dataList = dao.select();
for (int i = 0; i < dataList.size(); i++) {
statelist.add(false);//所有多选框初始状态是false,不勾选
}
}
/**
* 加载数据,适配显示
*/
private void initData() {
//监听checkbox状态
//点中时改成相反的值
//结算,判断是否勾选,若勾选价格相加,否则,价格相减
//勾选,价格是string类型的,所以价格和数量相乘前,先把价格转成double类型
//保留两位小数
//如果ck全部勾选,则全选选中
//给控件设置值
adapter = new BaseAdapter() {
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int i) {
return dataList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
class ViewHolder {
ImageView img;
TextView title;
TextView price;
TextView num;
CheckBox ck;
RelativeLayout rl;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
ViewHolder vh;
if (view == null) {
vh = new ViewHolder();
view = View.inflate(getActivity(), R.layout.shopcart_lv_item, null);
vh.img = (ImageView) view.findViewById(R.id.shopcart_img);
vh.title = (TextView) view.findViewById(R.id.shopcart_title);
vh.price = (TextView) view.findViewById(R.id.shopcart_price);
vh.num = (TextView) view.findViewById(R.id.shopcart_num);
vh.rl = (RelativeLayout) view.findViewById(R.id.shopcart_item_rl);
if (editor.getText().toString().equals("编辑")) {
vh.rl.setVisibility(View.GONE);
} else if (editor.getText().toString().equals("完成")) {
vh.rl.setVisibility(View.VISIBLE);
vh.num.setVisibility(View.GONE);
statelist.set(i, false);
}
vh.ck = (CheckBox) view.findViewById(R.id.shopcart_checked);
view.setTag(vh);
} else {
vh = (ViewHolder) view.getTag();
}
vh.ck.setChecked(statelist.get(i));
//监听checkbox状态
vh.ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//点中时改成相反的值
statelist.set(i, !statelist.get(i));
//结算,判断是否勾选,若勾选价格相加,否则,价格相减
if (statelist.get(i)) {
//勾选,价格是string类型的,所以价格和数量相乘前,先把价格转成double类型
double price = Double.parseDouble(dataList.get(i).price);
money += price * dataList.get(i).num;
} else {
double price = Double.parseDouble(dataList.get(i).price);
money -= price * dataList.get(i).num;
}
total_price.setText("总价:¥" + df.format(money));//保留两位小数
//如果ck全部勾选,则全选选中
if (statelist.contains(false)) {
allCheck.setChecked(false);
} else {
allCheck.setChecked(true);
}
notifyDataSetChanged();
}
});
//给控件设置值
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(dataList.get(i).img, vh.img);
vh.title.setText(dataList.get(i).title);
vh.price.setText("¥" + dataList.get(i).price);
vh.num.setText("数量:" + dataList.get(i).num);
return view;
}
};
//把适配器封装起来,因为如果布局改变,需要重新适配数据,只是通知适配器不行,
// 只有改变数据时,通知适配器才有用,这里主要是方便后面编辑布局改变时的用到的
listView.setAdapter(adapter);
}
/**
* 初始化事件
*/
private void initEvent() {
//监听全选
allCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean flag = allCheck.isChecked();
money = 0;
for (int i = 0; i < statelist.size(); i++) {
statelist.set(i, flag);
if (allCheck.isChecked()) {
//全选,结算
double price = Double.parseDouble(dataList.get(i).price);
money += price * dataList.get(i).num;
} else {
money = 0;
}
}
adapter.notifyDataSetChanged();
total_price.setText("总价:¥" + df.format(money));
}
});
//编辑
editor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (editor.getText().toString().equals("编辑")) {
editor.setText("完成");
total_price.setVisibility(View.GONE);
total_btn.setText("删除");
money = 0;
total_price.setText("总价:¥0.00");
allCheck.setChecked(false);
} else if (editor.getText().toString().equals("完成")) {
editor.setText("编辑");
total_price.setVisibility(View.VISIBLE);
total_btn.setText("结算");
}
initData();
}
});
total_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
totalPrice();
}
});
}
//结算
private void totalPrice() {
if (total_btn.getText().toString().equals("结算")) {
if (!statelist.contains(true)) {
Toast.makeText(getContext(), "您还没有选中任何商品哦!", Toast.LENGTH_SHORT).show();
} else {
<span style="white-space:pre"> </span>//结算跳转到支付宝,在这里先不做
}
} else if (total_btn.getText().toString().equals("删除")) {
if (!statelist.contains(true)) {
Toast.makeText(getContext(), "未选中任何商品删除", Toast.LENGTH_SHORT).show();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setView(View.inflate(getContext(), R.layout.delete_pop, null));
builder.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int ii) {
ShopDao dao = new ShopDao(getContext());
//根据状态集合,判断哪个是要删除的
for (int i = 0; i < statelist.size(); i++) {
if (statelist.get(i)) {
String title = dataList.get(i).title;
dao.delete(title);//从数据库中删除
}
}
//清空集合
dataList.clear();
statelist.clear();
//重新添加
dataList.addAll(dao.select());
//状态集合也要改变长度和状态
for (int i = 0; i < dataList.size(); i++) {
statelist.add(false);
}
//通知适配器
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("取消", null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
}
//数据库
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {
super(context, "yi.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//建表
sqLiteDatabase.execSQL("create table shopcart(id integer primary key autoincrement,img varchar(20),title varchar(20),price varchar(20),num int(11))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
//数据库升级
}
}
//dao
public class ShopDao {
private final MyOpenHelper myOpenHelper;
private final SQLiteDatabase datas;
public ShopDao(Context context){
myOpenHelper = new MyOpenHelper(context);
datas = myOpenHelper.getWritableDatabase();
}
//添加
public void addData(DetailBean.Data.Goods goods,String title,int i){
ContentValues values=new ContentValues();
values.put("img",goods.gallery.get(0).normal_url);
values.put("title",title);
values.put("price",goods.shop_price);
values.put("num",i);
datas.insert("shopcart",null,values);
}
//查询
public List<ShopcartBean> select(){
Cursor cursor = datas.query(false, "shopcart", null, null, null ,null, null, null, null);
//创建集合
List<ShopcartBean> list=new ArrayList<ShopcartBean>();
while(cursor.moveToNext()){
String img = cursor.getString(cursor.getColumnIndex("img"));
String title = cursor.getString(cursor.getColumnIndex("title"));
String price = cursor.getString(cursor.getColumnIndex("price"));
int num = cursor.getInt(cursor.getColumnIndex("num"));
ShopcartBean bean=new ShopcartBean(img,title,price,num);
list.add(bean);
}
//关闭游标
closeCourse(cursor);
return list;
}
//删除
public void delete(String title){
datas.delete("shopcart","title=?",new String[]{title});
}
//关闭数据库
public void closeData()
{
if(datas!=null&&datas.isOpen())
{
datas.close();
}
}
//关闭游标
public void closeCourse(Cursor cursor)
{
if(!cursor.isClosed())
{
cursor.close();
}
}
}
//反选代码部分,主要提供思路
reverse.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (! checkAdapter.getSelect().contains(true)) {
Toast.makeText(MainActivity.this, "qingxuanz", 0).show();
}else {
for (int i = 0; i < checkAdapter.getSelect().size(); i++) {
if (checkAdapter.getSelect().get(i)) {
checkAdapter.getSelect().set(i, false);
}else {
checkAdapter.getSelect().set(i, true);
}
}
if (checkAdapter.getSelect().contains(false)) {
allBox.setChecked(false);
}
checkAdapter.notifyDataSetChanged();
}
}
});
}
点击保存到购物车,数据存到数据库,购物车界面的数据展示是从数据库中查询出来展示的,所以删也要从数据库中删除,重新适配一下
以上只是提供了一些思路,具体到项目中还要随机应变,上述代码可以实现全选反选