二级列表适配器
public class MyAdapter extends BaseExpandableListAdapter {
private Context context;
private List<Data.DataBean> list;
//创建有参和无参构造方法
public MyAdapter(Context context, List<Data.DataBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getGroupCount() {
return list.size();
}
@Override
public int getChildrenCount(int groupPosition) {
//二级列表
return list.get(groupPosition).getSpus().size();
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
groupHolder groupHolder=null;
if (groupHolder==null){
convertView = View.inflate(context, R.layout.grouplist, null);
groupHolder = new groupHolder();
groupHolder.checkBox=convertView.findViewById(R.id.checkbox);
groupHolder.title=convertView.findViewById(R.id.title);
convertView.setTag(groupHolder);
}
else{
groupHolder = (MyAdapter.groupHolder) convertView.getTag();
}
//得到小组的名字
Data.DataBean bean = list.get(groupPosition);
groupHolder.title.setText(bean.getName()+"");
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
childHolder childHolder=null;
if (childHolder==null){
convertView = View.inflate(context, R.layout.childlist, null);
childHolder = new childHolder();
childHolder.checkBox1=convertView.findViewById(R.id.Child_Check_CB);
childHolder.img=convertView.findViewById(R.id.img);
childHolder.title=convertView.findViewById(R.id.Child_title);
childHolder.price=convertView.findViewById(R.id.Child_price);
childHolder.jiaJianView=convertView.findViewById(R.id.jiajian);
convertView.setTag(childHolder);
}
else{
childHolder = (MyAdapter.childHolder) convertView.getTag();
}
Data.DataBean.SpusBean bean = list.get(groupPosition).getSpus().get(childPosition);
Glide.with(context).load(bean.getPic_url()).into(childHolder.img);
childHolder.price.setText(bean.getSkus().get(0).getPrice()+"");
childHolder.title.setText(bean.getName()+"");
childHolder.checkBox1.setChecked(bean.isChildChecked());
childHolder.jiaJianView.setmNumber(bean.getPraise_num());
childHolder.checkBox1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (adapterCallback!=null){
adapterCallback.setChildCheck(groupPosition,childPosition);
}
}
});
childHolder.jiaJianView.setOnChange(new JiaJianView.OnCountChange() {
@Override
public void setCount(int count) {
if (adapterCallback!=null){
adapterCallback.setNumber(groupPosition,childPosition,count);
}
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
//接口进行展示数据
class groupHolder {
CheckBox checkBox;
TextView title;
}
class childHolder{
CheckBox checkBox1;
ImageView img;
TextView title;
TextView price;
JiaJianView jiaJianView;
}
//点击Group的checkbOX让所有CHILDxuanzhong
public void childAllCheck(int groupPostion,boolean isCheck){
Data.DataBean bean = list.get(groupPostion);
List<Data.DataBean.SpusBean> spus = bean.getSpus();
for (int i = 0; i <spus.size() ; i++) {
Data.DataBean.SpusBean spusBean = spus.get(i);
spusBean.setChildChecked(isCheck);
}
}
//用来判断小组是否全被选中
public boolean isChildAllCheck(int groupPostion){
boolean boo=true;
Data.DataBean dataBean = list.get(groupPostion);
List<Data.DataBean.SpusBean> spus = dataBean.getSpus();
for (int i = 0; i <spus.size() ; i++) {
Data.DataBean.SpusBean bean = spus.get(i);
if (!bean.isChildChecked()){
return false;
}
}
return boo;
}
//点击child给她进行赋值
public void setChildChecked(int groupPositon,int childPostion,boolean isCheckbox){
Data.DataBean.SpusBean spusBean = list.get(groupPositon).getSpus().get(childPostion);
spusBean.setChildChecked(isCheckbox);
}
//查看当前这个商品有没有被选中
public boolean isChildChecked(int groupPositon,int childPostion ){
Data.DataBean.SpusBean spusBean = list.get(groupPositon).getSpus().get(childPostion);
if (spusBean.isChildChecked()){
return true;
}
return false;
}
//给商品数量赋值
public void setShangPingNumber(int groupPosition, int childPosition, int number) {
Data.DataBean.SpusBean spusBean = list.get(groupPosition).getSpus().get(childPosition);
spusBean.setPraise_num(number);
}
//底部按钮实现全选反选功能
public boolean isAllGoods() {
boolean boo = true;
for (int i = 0; i < list.size(); i++) {
Data.DataBean dataBean = list.get(i);
for (int j = 0; j < dataBean.getSpus().size(); j++) {
Data.DataBean.SpusBean spusBean = dataBean.getSpus().get(j);
if (!spusBean.isChildChecked()) {
boo = false;
}
}
}
return boo;
}
//全选反选功能
public void setAllGoodsIsChecked(boolean isAllCheck){
for (int i = 0; i <list.size() ; i++) {
Data.DataBean dataBean = list.get(i);
for (int j = 0; j <dataBean.getSpus().size() ; j++) {
Data.DataBean.SpusBean spusBean = dataBean.getSpus().get(j);
spusBean.setChildChecked(isAllCheck);
}
}
}
//计算所有商品的数量
public int getAllGoodsPrice(){
int allPrice=0;
for (int i = 0; i <list.size() ; i++) {
Data.DataBean dataBean = list.get(i);
for (int j = 0; j <dataBean.getSpus().size() ; j++) {
Data.DataBean.SpusBean spusBean = dataBean.getSpus().get(j);
if (spusBean.isChildChecked()){
allPrice+=spusBean.getPraise_num()*Float.parseFloat(spusBean.getSkus().get(0).getPrice());
}
}
}
return allPrice;
}
//计算所有商品的数量
public int getAllGoodsNumber(){
int allNumber=0;
for (int i = 0; i <list.size() ; i++) {
Data.DataBean dataBean = list.get(i);
for (int j = 0; j <dataBean.getSpus().size() ; j++) {
Data.DataBean.SpusBean spusBean = dataBean.getSpus().get(j);
if (spusBean.isChildChecked()){
allNumber+=spusBean.getPraise_num();
}
}
}
return allNumber;
}
//点击group的checkBox让所有child被选中
//因为点击Group和Child第CheckBox在主页面都需要刷新值所以做成接口回调
public interface AdapterCallback{
void setGroupCheck(int groupPostion);
void setChildCheck(int groupPostion,int childPostion);
//点击加减按钮进行刷新
void setNumber(int groupPostion,int childPostion,int number);
}
private AdapterCallback adapterCallback;
public void setCallback(AdapterCallback adapterCallback) {
this.adapterCallback = adapterCallback;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private CheckBox qx;
private TextView price;
private TextView js;
private ExpandableListView expanded_menu;
private List<Data.DataBean> list=new ArrayList<>();
private MyAdapter myAdapter;
private String Murl="http://www.wanandroid.com/tools/mockapi/6523/restaurant-list";
//设置Handler发送消息
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String S = (String) msg.obj;
Gson gson = new Gson();
Data data = gson.fromJson(S, Data.class);
list.addAll(data.getData());
myAdapter.notifyDataSetChanged();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
myAdapter= new MyAdapter(this,list);
//设置适配器
expanded_menu.setAdapter(myAdapter);
getNetData();
setOnListener();
}
private void setOnListener() {
myAdapter.setCallback(new MyAdapter.AdapterCallback() {
@Override
public void setGroupCheck(int groupPostion) {
boolean childAllCheck = myAdapter.isChildAllCheck(groupPostion);
myAdapter.childAllCheck(groupPostion, !childAllCheck);
myAdapter.notifyDataSetChanged();
flushBottomLayout();
}
@Override
public void setChildCheck(int groupPostion, int childPostion) {
//得到你要点击的商品Child是否是选中状态
boolean childChecked = myAdapter.isChildChecked(groupPostion, childPostion);
myAdapter.setChildChecked(groupPostion, childPostion, !childChecked);
myAdapter.notifyDataSetChanged();
flushBottomLayout();
}
@Override
public void setNumber(int groupPostion, int childPostion, int number) {
myAdapter.setShangPingNumber(groupPostion, childPostion, number);
myAdapter.notifyDataSetChanged();
flushBottomLayout();
}
});
}
//开始解析数据
private void getNetData() {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(Murl).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
//成功
@Override
public void onResponse(Call call, Response response) throws IOException {
//fasongxiaox
mHandler.sendMessage(mHandler.obtainMessage(0,response.body().string()));
}
});
qx.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean allGoods = myAdapter.isAllGoods();
myAdapter.setAllGoodsIsChecked(!allGoods);
//刷新数据
myAdapter.notifyDataSetChanged();
flushBottomLayout();
}
});
}
private void initView() {
qx = (CheckBox) findViewById(R.id.qx);
price = (TextView) findViewById(R.id.price);
js = (TextView) findViewById(R.id.js);
expanded_menu = (ExpandableListView) findViewById(R.id.expanded_menu);
//去掉小箭头
expanded_menu.setGroupIndicator(null);
}
//刷新底部数据
private void flushBottomLayout(){
boolean allGoods = myAdapter.isAllGoods();
qx.setChecked(allGoods);
float allGoodsPrice = myAdapter.getAllGoodsPrice();
int allGoodsNumber = myAdapter.getAllGoodsNumber();
price.setText("价格"+allGoodsPrice);
js.setText("去结算"+allGoodsNumber);
}
}
childList中的checkBox要设置成false
子布局中要加入加减器
加减器的实现
public class JiaJianView extends LinearLayout implements View.OnClickListener {
private TextView mDelete;
private TextView mNumber;
private TextView mAdd;
private int mCount;
private int number;
public JiaJianView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.add, this);
initViews();
}
private void initViews() {
mAdd = findViewById(R.id.add_tv);
mDelete = findViewById(R.id.delete_tv);
mNumber = findViewById(R.id.product_number_tv);
mAdd.setOnClickListener(this);
mDelete.setOnClickListener(this);
}
public void setmNumber(int number){
this.mCount=number;
mNumber.setText(number+"");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.delete_tv:
if (mCount > 0) {
mCount--;
mNumber.setText(mCount + "");
if (mCountChange!=null){
mCountChange.setCount(mCount);
}
}else {
}
break;
case R.id.add_tv:
mCount++;
mNumber.setText(mCount + "");
if (mCountChange!=null){
mCountChange.setCount(mCount);
}
break;
}
}
public interface OnCountChange {
void setCount(int count);
}
private OnCountChange mCountChange;
public void setOnChange(OnCountChange countChange) {
this.mCountChange = countChange;
}
}