做开发,直接上效果,没有效果都是扯淡
这里用的二级列表(ExpandableListView)用的数据是一个json解析后的数据在bean 里面设置两个boolean 类型的数据来改变是否选中
这里用的是MVP 框架实现的购物车
这里实现的功能有:child 与group 的联动,互相监听,全选与child.group 的互动 加减控件的监听,实现选择后实时改变商品总价,与商品总数量。
直接上代码
github地址:https://github.com/victorlj/Shopping-Cart
MyAdapter
package com.example.mvp_gwc.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.mvp_gwc.R;
import com.example.mvp_gwc.bean.MyBean;
import com.example.mvp_gwc.weight.jiajianView;
import java.util.List;
public class MyAdapter extends BaseExpandableListAdapter {
private List<MyBean.DataBean> list;
private Context context;
public MyAdapter(List<MyBean.DataBean> list, Context context) {
this.list = list;
this.context = context;
}
@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(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
groupHolder groupHolder;
if(convertView ==null){
convertView =View.inflate(context, R.layout.expenr_group,null);
groupHolder = new groupHolder();
groupHolder.group_ck=convertView.findViewById(R.id.group_ck);
groupHolder.group_title=convertView.findViewById(R.id.group_title);
convertView.setTag(groupHolder);
}else{
groupHolder = (MyAdapter.groupHolder) convertView.getTag();
}
groupHolder.group_ck.setChecked(list.get(groupPosition).isGroupischeck());
groupHolder.group_title.setText(list.get(groupPosition).getName());
// group 中group_ck的点击事件
groupHolder.group_ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (adaptercallback!=null){
adaptercallback.groupchecked(groupPosition);
}
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
childHolder childHolder;
if(convertView ==null){
convertView =View.inflate(context, R.layout.expenr_child,null);
childHolder = new childHolder();
childHolder.child_ck=convertView.findViewById(R.id.child_ck);
childHolder.child_title=convertView.findViewById(R.id.child_title);
childHolder.child_img=convertView.findViewById(R.id.child_img);
childHolder.child_price=convertView.findViewById(R.id.child_price);
childHolder.jiajianView =convertView.findViewById(R.id.jiajian);
convertView.setTag(childHolder);
}else{
childHolder = (MyAdapter.childHolder) convertView.getTag();
}
childHolder.child_ck.setChecked(list.get(groupPosition).getSpus().get(childPosition).isChildischeck());
childHolder.child_title.setText(list.get(groupPosition).getSpus().get(childPosition).getName());
childHolder.child_price.setText(list.get(groupPosition).getSpus().get(childPosition).getSkus().get(0).getPrice()+"");
Glide.with(convertView).load(list.get(groupPosition).getSpus().get(childPosition).getPic_url()).into(childHolder.child_img);
childHolder.jiajianView.setNum(list.get(groupPosition).getSpus().get(childPosition).getPraise_num());
// childHolder 中child.ck 的点击事件
childHolder.child_ck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(adaptercallback!=null){
adaptercallback.childchecked(groupPosition,childPosition);
}
}
});
// childHolder中jiajianView 的监听事件
childHolder.jiajianView.setjiajian(new jiajianView.jiajiancallback() {
@Override
public void setjiajian(int mnum) {
list.get(groupPosition).getSpus().get(childPosition).setPraise_num(mnum);
if(adaptercallback!=null){
adaptercallback.jiajian();
}
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
class groupHolder{
CheckBox group_ck;
TextView group_title;
}
class childHolder{
CheckBox child_ck;
TextView child_title;
TextView child_price;
ImageView child_img;
jiajianView jiajianView;
}
// 查看group 中所有child的状态
public boolean lookgroupchecked(int groupposition){
for (int i = 0; i <list.get(groupposition).getSpus().size(); i++) {
if(!list.get(groupposition).getSpus().get(i).isChildischeck()){
return false;
}
}
return true;
}
// 根据查看group 的状态然后改变child 的状态和group 的状态
public void groupallchecked(int groupposition,boolean b){
list.get(groupposition).setGroupischeck(b);
for (int i = 0; i <list.get(groupposition).getSpus().size(); i++) {
list.get(groupposition).getSpus().get(i).setChildischeck(b);
}
}
// 查看child 的状态
public boolean lookchildchecked(int groupposition,int childposition){
boolean b = list.get(groupposition).getSpus().get(childposition).isChildischeck();
return b;
}
// 改变child 的状态 然后 查看group 的状态最后改变group 的状态,
public void childckecked(int groupposition,int childposition,boolean b){
list.get(groupposition).getSpus().get(childposition).setChildischeck(b);
boolean b1 = lookgroupchecked(groupposition);
if(b1){
list.get(groupposition).setGroupischeck(b1);
}else{
list.get(groupposition).setGroupischeck(b1);
}
}
// 查看是否全部选中
public boolean lookallchecked(){
for (int i = 0; i <list.size(); i++) {
if(!lookgroupchecked(i)){
return false;
}
}
return true;
}
// 改变全选与全不选
public void setallchecked(boolean b){
for (int i = 0; i <list.size(); i++) {
groupallchecked(i,b);
}
}
@Override
public boolean areAllItemsEnabled() {
return super.areAllItemsEnabled();
}
// 自定义接口
public interface Adaptercallback{
// group 的监听事件
void groupchecked(int groupposition);
// child的监听事件
void childchecked(int groupposition,int childposition);
// 加减的监听事件
void jiajian();
}
private Adaptercallback adaptercallback;
public void setcallback(Adaptercallback adaptercallback){
this.adaptercallback =adaptercallback;
}
}
MainActivity
package com.example.mvp_gwc;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.mvp_gwc.adapter.MyAdapter;
import com.example.mvp_gwc.base.BaseActivity;
import com.example.mvp_gwc.bean.MyBean;
import com.example.mvp_gwc.ivew.IVew;
import com.example.mvp_gwc.pressent.PressentImpl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class MainActivity extends BaseActivity implements IVew {
private CheckBox main_ck_qx;
private TextView allprice;
private TextView allnum;
private ExpandableListView expend;
private PressentImpl pressent;
private List<MyBean.DataBean> list = new ArrayList<>();
private String murl = "http://www.wanandroid.com/tools/mockapi/6523/restaurant-list";
private MyAdapter adapter;
@Override
protected int getLayout() {
return R.layout.activity_main;
}
@Override
protected void getfindbyid() {
main_ck_qx = findViewById(R.id.main_ck_qx);
allprice = findViewById(R.id.allprice);
allnum = findViewById(R.id.allnum);
expend = findViewById(R.id.expend);
adapter = new MyAdapter(list, this);
expend.setAdapter(adapter);
expend.setGroupIndicator(null);
adapter.setcallback(new MyAdapter.Adaptercallback() {
@Override
public void groupchecked(int groupposition) {
boolean b = adapter.lookgroupchecked(groupposition);
adapter.groupallchecked(groupposition, !b);
boolean b1 = adapter.lookallchecked();
if (b1) {
main_ck_qx.setChecked(b1);
} else {
main_ck_qx.setChecked(b1);
}
getallprice();
getallnumber();
adapter.notifyDataSetChanged();
}
@Override
public void childchecked(int groupposition, int childposition) {
boolean b = adapter.lookchildchecked(groupposition, childposition);
adapter.childckecked(groupposition, childposition, !b);
boolean b1 = adapter.lookallchecked();
if (b1) {
main_ck_qx.setChecked(b1);
} else {
main_ck_qx.setChecked(b1);
}
getallprice();
getallnumber();
adapter.notifyDataSetChanged();
}
@Override
public void jiajian() {
getallprice();
getallnumber();
}
});
}
@Override
protected void setonclicked() {
main_ck_qx.setOnClickListener(this);
}
@Override
protected void prasce() {
pressent = new PressentImpl(this);
pressent.getdata(murl);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_ck_qx:
boolean b = adapter.lookallchecked();
main_ck_qx.setChecked(!b);
adapter.setallchecked(!b);
getallprice();
getallnumber();
adapter.notifyDataSetChanged();
break;
}
}
@Override
public void success(Object success) {
list.addAll((Collection<? extends MyBean.DataBean>) success);
getallprice();
getallnumber();
adapter.notifyDataSetChanged();
// 第一次加载就展开所有的子类
for (int i = 0; i <list.size(); i++) {
expend.expandGroup(i);
}
// 不能点击收缩
expend.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return true;
}
});
}
@Override
public void error(String error) {
Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}
public void getallprice() {
double number = 0.0;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).getSpus().size(); j++) {
if (list.get(i).getSpus().get(j).isChildischeck()) {
number += list.get(i).getSpus().get(j).getPraise_num() * list.get(i).getSpus().get(j).getSkus().get(0).getPrice();
}
}
}
allprice.setText("商品总价:" + number + "");
}
public void getallnumber() {
int number = 0;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).getSpus().size(); j++) {
if (list.get(i).getSpus().get(j).isChildischeck()) {
number += list.get(i).getSpus().get(j).getPraise_num();
}
}
}
allnum.setText("商品总数量:" + number + "");
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/lin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<CheckBox
android:id="@+id/main_ck_qx"
android:text="全选"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/allprice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="商品总价:" />
<TextView
android:id="@+id/allnum"
android:text="商品总数量:"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<ExpandableListView
android:id="@+id/expend"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/lin"></ExpandableListView>
</RelativeLayout>
自定义控件jiajianView
package com.example.mvp_gwc.weight;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.mvp_gwc.R;
public class jiajianView extends LinearLayout implements View.OnClickListener {
private TextView jian;
private TextView ed;
private TextView jia;
private int mnum;
public jiajianView(Context context, AttributeSet attrs) {
super(context, attrs);
LinearLayout.inflate(context, R.layout.add_jian, this);
init();
}
public void setNum(int num){
this.mnum =num;
ed.setText(num+"");
}
private void init() {
jian =findViewById(R.id.jian);
jia =findViewById(R.id.jia);
jia.setOnClickListener(this);
jian.setOnClickListener(this);
ed =findViewById(R.id.ed);
}
private jiajiancallback jiajiancallback;
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.jia:
mnum++;
ed.setText(mnum+"");
if(jiajiancallback!=null){
jiajiancallback.setjiajian(mnum);
}
break;
case R.id.jian:
if(mnum>0){
mnum--;
ed.setText(mnum+"");
if(jiajiancallback!=null){
jiajiancallback.setjiajian(mnum);
}
}else{
Toast.makeText(getContext(), "最小为0", Toast.LENGTH_SHORT).show();
}
break;
}
}
public interface jiajiancallback{
void setjiajian(int mnum);
}
public void setjiajian(jiajiancallback jiajiancallback){
this.jiajiancallback =jiajiancallback;
}
}