这是在Fragment中实现,自己使用的地方根据自己需求来定义
public class Fragment_GouWuChe extends Fragment {
private View view;
private GWC_dao dao;
private ExpandableListView EX_listview;
private TextView notdata;
private CheckBox checkAll;
private TextView price;
private TextView checked_shop;
private FM_GWC_Adapter adapter;
private TextView total_price;
private static ArrayList<SQliteBean> list;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = View.inflate(getContext(), R.layout.fragment_gouwuche, null);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
//当这个集合等于空的时候来查询数据
list = dao.selectAll();
//如果数据库无内容,显示TextView的提示无内容,recyclerView影藏
if (list.size() > 0) {
//如果出具库有数据就处理相关逻辑
Listener(list);
} else {
//数据库没有东西的时候让TextView显示购物车为空
notdata.setVisibility(View.VISIBLE);
}
//点击一级列表删除信息
EX_listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
//查询下标对应的商品id,在添加数据库的时候会专门来保存商品id
String gc_id = list.get(position).getGc_id();
//执行删除数据库
dao.deleteData(gc_id);
Toast.makeText(getContext(), "删除成功", Toast.LENGTH_SHORT).show();
//删除成功以后.重新查询数据库
list = dao.selectAll();
//如果数据无内容,提示无内容,recyclerVIew影藏
if (list.size() > 0) {
//如果出具库有数据就处理相关逻辑
Listener(list);
} else {
//数据库没有东西的时候让TextView显示购物车为空
notdata.setVisibility(View.VISIBLE);
}
return true;
}
});
}
//执行相关事件
private void Listener(ArrayList<SQliteBean> list) {
//有数据以后把这个textview隐藏
notdata.setVisibility(View.GONE);
//为二级列表设置适配器,list就是从数据库查询出来的数据
adapter = new FM_GWC_Adapter(list, getContext());
EX_listview.setAdapter(adapter);
//全选按钮
checkAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//代用适配器中的自定义方法,循环遍历二级列表,设置全选或全不选
adapter.setCheckedAll();
//得到查询到的选中项目的总条目数,和总价格
String[] split = adapter.getShopNumber().split(",");
//设置选中的商品个数
checked_shop.setText("(" + split[1] + ")");
//设置价格
total_price.setText("合计:¥" + split[0]);
}
});
//刷新选中的个数,和判断是否全部选中
adapter.getNumberAndIsCheckAll(new FM_GWC_Adapter.NumberAndIsCheckAll() {
@Override
public void getNumber(View view, String shop, boolean ischecked) {
//split[0]=价格, split[1]个数
String[] split = shop.split(",");
//设置选中的商品个数
checked_shop.setText("(" + split[1] + ")");
//设置价格
total_price.setText("合计:¥" + split[0]);
//设置商品全部选中的时候,全选按钮也自动选中
checkAll.setChecked(ischecked);
}
});
//设置当所有商品全部选中的时候,全选按钮也设置选中状态
checkAll.setChecked(adapter.selectShopAll());
//刷新适配器
adapter.notifyDataSetChanged();
}
private void initView() {
//显示数据
EX_listview = (ExpandableListView) view.findViewById(R.id.gwc_ex_listview);
//如果购物车空的时候让他显示购物车为空
notdata = (TextView) view.findViewById(R.id.notdata);
//操作数据库
dao = new GWC_dao(getContext());
//全选按钮
checkAll = (CheckBox) view.findViewById(R.id.checkAll);
//价格
price = (TextView) view.findViewById(R.id.price);
//结算的时候选中的店铺个数
checked_shop = (TextView) view.findViewById(R.id.checked_shop);
//总价格
total_price = (TextView) view.findViewById(R.id.price);
//定位按钮重启Activity,刷新数据
view.findViewById(R.id.dingwei).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().recreate();
getActivity().overridePendingTransition(R.anim.shape02, R.anim.shape01);
}
});
}
}
//下面是二级列表 ExpandableListView 的适配器的逻辑,实际的数据根据自己需求来改变
//可以直接复制来使用
public class FM_GWC_Adapter extends BaseExpandableListAdapter {
private ArrayList<SQliteBean> list;//数据库的信息
private Context context;
private ArrayList<HashMap<Integer, Boolean>> groupList;//保存一级列表checkbox状态
private ArrayList<ArrayList<HashMap<Integer, Boolean>>> childList;//保存二级列表checkbox状态
private String[] groups;//保存一级列表内容
private DataActivity_Bean.DatasBean.GoodsCommendListBean[][] childs;//保存二级列表内容
//保存商品单价和数量,里面的GWC_Data是自定义的JavaBean,根据自己需求来定义属性
private List<List<GWC_Data>> dataList;
public FM_GWC_Adapter(ArrayList<SQliteBean> datalist, Context context) {
this.list = datalist;//传过来的数据库的内容
this.context = context;
//初始化数据
initData();
}
//初始化数据
private void initData() {
dataList = new ArrayList<>();//保存商品单价和数量
groupList = new ArrayList<>();//保存一级列表checkbox状态
childList = new ArrayList<>();//保存二级列表checkbox状态
groups = new String[list.size()];//保存一级列表内容
childs = new DataActivity_Bean.DatasBean.GoodsCommendListBean[list.size()][];//保存二级列表内容
for (int i = 0; i < list.size(); i++) {
//得到每一个存储商品信息的json数据
String path = list.get(i).getPath();
//解析json
DataActivity_Bean bean = new Gson().fromJson(path, DataActivity_Bean.class);
//一级列表得到的标题太长,截取几位显示
String goods_name = bean.getDatas().getGoods_info().getGoods_name().substring(0, 9);
//保存一级列表的名字,商家1,商家2...
groups[i] = goods_name + (i + 1);
//保存一级列表中的checkbox是否选中
HashMap<Integer, Boolean> gmap = new HashMap<>();
gmap.put(i, false);
groupList.add(gmap);
//这个是设置二级列表的数据
List<DataActivity_Bean.DatasBean.GoodsCommendListBean> goods_list = bean.getDatas().
getGoods_commend_list();//得到数据里面保存的商品信息的集合
//这里-5的原因是因为返回的集合太长,只为了实现效果,所以让他只显示了3条数据,方便操作
DataActivity_Bean.DatasBean.GoodsCommendListBean[] strings =
new DataActivity_Bean.DatasBean.GoodsCommendListBean[goods_list.size() - 5];
ArrayList<HashMap<Integer, Boolean>> listHashMap = new ArrayList<>();
ArrayList<GWC_Data> gwc_datas = new ArrayList<>();//每个二级列表的单价和数量
for (int y = 0; y < strings.length; y++) {
//创建每一个二级列表中数据的HashMap集合,保存状态
HashMap<Integer, Boolean> hashMap = new HashMap<>();
hashMap.put(y, false);
listHashMap.add(hashMap);
//保存二级列表的数据
strings[y] = goods_list.get(y);
//保存单价,默认数量是一个
gwc_datas.add(new GWC_Data(goods_list.get(y).getGoods_promotion_price(), "1"));
}
childList.add(listHashMap);
childs[i] = strings;
dataList.add(gwc_datas);
}
}
@Override
public int getGroupCount() {
return groups.length;
}
@Override
public int getChildrenCount(int groupPosition) {
return childs[groupPosition].length;
}
@Override
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childs[childPosition];
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupholder = null;
if (convertView == null) {
convertView = View.inflate(context, R.layout.gouwuche_group_item, null);
groupholder = new GroupViewHolder();
groupholder.ck = (CheckBox) convertView.findViewById(R.id.group_checkbox);
groupholder.title = (TextView) convertView.findViewById(R.id.group_name);
convertView.setTag(groupholder);
} else {
groupholder = (GroupViewHolder) convertView.getTag();
}
groupholder.title.setText(groups[groupPosition]);
final GroupViewHolder finalGroupholder = groupholder;
groupholder.ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HashMap<Integer, Boolean> hashMap = groupList.get(groupPosition);
hashMap.put(groupPosition, !groupList.get(groupPosition).get(groupPosition));
//点击一级列表,让二级列表全部选中
setChildCheckBox(groupPosition);
//得到选中的商品数和价格拼成的字符串
String shop = getShopNumber();
//查询是否全部选中
boolean b = selectShopAll();
//调用自定义接口,把数据传出去
numberAndIsCheckAll.getNumber(v, shop, b);
notifyDataSetChanged();
}
});
Boolean aBoolean = groupList.get(groupPosition).get(groupPosition);
groupholder.ck.setChecked(aBoolean);
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder holder = null;
if (convertView == null) {
convertView = View.inflate(context, R.layout.gouwuche_child_item, null);
holder = new ChildViewHolder();
holder.ck = (CheckBox) convertView.findViewById(R.id.child_checkbox);
holder.img = (ImageView) convertView.findViewById(R.id.gwc_item_img);
holder.title = (TextView) convertView.findViewById(R.id.gwc_item_name);
holder.price = (TextView) convertView.findViewById(R.id.gwc_item_price);
holder.jianshao = (ImageView) convertView.findViewById(R.id.jianshao);
holder.num = (TextView) convertView.findViewById(R.id.gwc_number);
holder.zengjia = (ImageView) convertView.findViewById(R.id.zengjia);
convertView.setTag(holder);
} else {
holder = (ChildViewHolder) convertView.getTag();
}
DataActivity_Bean.DatasBean.GoodsCommendListBean goodsCommendListBean = childs[groupPosition][childPosition];
//价格
String goods_price = goodsCommendListBean.getGoods_promotion_price();
holder.price.setText(goods_price);
//标题
holder.title.setText(goodsCommendListBean.getGoods_name());
//复选框的点击事件
holder.ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<HashMap<Integer, Boolean>> mapArrayList = childList.get(groupPosition);
HashMap<Integer, Boolean> hashMap = mapArrayList.get(childPosition);
hashMap.put(childPosition, !hashMap.get(childPosition));
//判断二级列表选中的个数
setGroupCheckBox(groupPosition, childPosition);
//得到选中的商品数和价格拼成的字符串
String shop = getShopNumber();
//查询是否全部选中
boolean b = selectShopAll();
//调用自定义接口,把数据传出去
numberAndIsCheckAll.getNumber(v, shop, b);
notifyDataSetChanged();
}
});
//设置他的选中状态,根据集合来变化
ArrayList<HashMap<Integer, Boolean>> arrayList = childList.get(groupPosition);
HashMap<Integer, Boolean> hashMap = arrayList.get(childPosition);
holder.ck.setChecked(hashMap.get(childPosition));
//当个数大于一的时候减少按钮才可以点击,否则不能点击
int number = Integer.parseInt(holder.num.getText().toString());
if (number > 1) {
holder.jianshao.setEnabled(true);
} else if (number <= 1) {
holder.jianshao.setEnabled(false);
}
//增加数量
final ChildViewHolder finalHolder = holder;
holder.zengjia.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int number = Integer.parseInt(finalHolder.num.getText().toString());
number += 1;
//修改集合中相对应的数量
List<GWC_Data> gwc_datas = dataList.get(groupPosition);
gwc_datas.get(childPosition).setNumber(number + "");
//修改页面的显示数量
finalHolder.num.setText(number + "");
//得到选中的商品数和价格拼成的字符串
String shop = getShopNumber();
//调用自定义接口,把数据传出去
numberAndIsCheckAll.getNumber(v, shop, b);
notifyDataSetChanged();
}
});
holder.jianshao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int number = Integer.parseInt(finalHolder.num.getText().toString());
if (number > 1) {
--number;
//修改集合中相对应的数量
List<GWC_Data> gwc_datas = dataList.get(groupPosition);
gwc_datas.get(childPosition).setNumber(number + "");
//修改页面的显示数量
finalHolder.num.setText(number + "");
}
//得到选中的商品数和价格拼成的字符串
String shop = getShopNumber();
//调用自定义接口,把数据传出去
numberAndIsCheckAll.getNumber(v, shop, b);
notifyDataSetChanged();
notifyDataSetChanged();
}
});
/* for (int i = 0; i < dataList.size(); i++) {
List<GWC_Data> gwc_datas = dataList.get(i);
for (int y = 0; y < gwc_datas.size(); y++) {
Logger.e("遍历集合:" + "卖家" + i + "商品" + y + "===" + gwc_datas.get(y).toString());
}
}*/
return convertView;
}
public NumberAndIsCheckAll numberAndIsCheckAll;
public interface NumberAndIsCheckAll {
void getNumber(View view, String shop, boolean ischecked);
}
public void getNumberAndIsCheckAll(NumberAndIsCheckAll numberAndIsCheckAll) {
this.numberAndIsCheckAll = numberAndIsCheckAll;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
@Override
public boolean hasStableIds() {
return true;
}
//点击一级列表,让二级列表全部选中
public void setChildCheckBox(int index) {
//遍历存放二级列表数据的集合,设置成一级列表的选中状态
ArrayList<HashMap<Integer, Boolean>> hashMaps = childList.get(index);
for (int i = 0; i < hashMaps.size(); i++) {
HashMap<Integer, Boolean> hashMap = hashMaps.get(i);
Set<Map.Entry<Integer, Boolean>> set = hashMap.entrySet();
for (Map.Entry<Integer, Boolean> entry : set) {
entry.setValue(groupList.get(index).get(index));
}
}
notifyDataSetChanged();
}
//点击二级列表的时候,判断是否全选中,如果全选中让一级列表也选中
public void setGroupCheckBox(int grouIndex, int childIndex) {
ArrayList<HashMap<Integer, Boolean>> arrayList = childList.get(grouIndex);
boolean isChecked = true;
for (int i = 0; i < arrayList.size(); i++) {
HashMap<Integer, Boolean> hashMap = arrayList.get(i);
Set<Map.Entry<Integer, Boolean>> set = hashMap.entrySet();
for (Map.Entry<Integer, Boolean> entry : set) {
if (!entry.getValue()) {
isChecked = false;
break;
}
}
}
HashMap<Integer, Boolean> groupHashMap = groupList.get(grouIndex);
groupHashMap.put(grouIndex, isChecked);
notifyDataSetChanged();
}
//全选,传的参数判断全选按钮是否选中(true,false),让列表随之改变
public void setCheckedAll() {
boolean boo = false;
//判断是否有没选中,有没选中的话boo=true,在下面的遍历中会全部设置成true
//如果都是选中状态,boo=false,在下面的遍历中会全部设置成false
for (int i = 0; i < groupList.size(); i++) {
HashMap<Integer, Boolean> hashMap = groupList.get(i);
Set<Map.Entry<Integer, Boolean>> set = hashMap.entrySet();
for (Map.Entry<Integer, Boolean> entry : set) {
//如果有没选中的,就把boo设置成true
//然后下面的那个循环中,把boo设置到value中
if (!entry.getValue()) {
boo = true;
break;
}
}
}
//设置成一级列表的选中状态
for (int i = 0; i < groupList.size(); i++) {
HashMap<Integer, Boolean> hashMap = groupList.get(i);
Set<Map.Entry<Integer, Boolean>> set = hashMap.entrySet();
for (Map.Entry<Integer, Boolean> entry : set) {
entry.setValue(boo);
}
setChildCheckBox(i);
}
notifyDataSetChanged();
}
//计算选中的商品个数和总价格
public String getShopNumber() {
double Total_price = 0;//总价格
int Total_number = 0;//总数量
String str = null;
for (int i = 0; i < childList.size(); i++) {
ArrayList<HashMap<Integer, Boolean>> childArrayList = childList.get(i);
for (int y = 0; y < childArrayList.size(); y++) {
HashMap<Integer, Boolean> hashMap = childArrayList.get(y);
Set<Map.Entry<Integer, Boolean>> set = hashMap.entrySet();
//如果店铺选中,得到总价和数量
for (Map.Entry<Integer, Boolean> entry : set) {
if (entry.getValue()) {
//如果选中,得到单价个数量
GWC_Data gwc_data = dataList.get(i).get(y);
double price = Double.parseDouble(gwc_data.getPrice());
int number = Integer.parseInt(gwc_data.getNumber());
Total_price += (price * number);
Total_number += number;
}
}
}
}
//把总价格和数量拼成字符串
str = Total_price + "," + Total_number;
return str;
}
//当所有商品全部选中,全选按钮也选中,遍历一级列表,如果一级列表全部选中,则按钮也选中
public boolean selectShopAll() {
//默认让全选按钮选中
boolean boo = true;
//循环遍历,如果有一个没选中,就设置全选按钮不选中
for (int i = 0; i < groupList.size(); i++) {
HashMap<Integer, Boolean> hashMap = groupList.get(i);
Set<Map.Entry<Integer, Boolean>> set = hashMap.entrySet();
for (Map.Entry<Integer, Boolean> entry : set) {
if (!entry.getValue()) {
boo = false;
break;
}
}
}
return boo;
}
class GroupViewHolder {
CheckBox ck;
TextView title;
}
class ChildViewHolder {
CheckBox ck;
TextView title;
ImageView img;
TextView price;
TextView num;
ImageView zengjia;
ImageView jianshao;
}
}