BaseActivity 抽取Activity基类
public abstract class BaseActivity
extends AppCompatActivity implements IContract.IView {
public P p;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayout());
p = initPresenter();
if (p!=null){
p.onAttach(this);
}
initView();
initData();
}
protected abstract void initData();
protected abstract void initView();
protected abstract P initPresenter();
protected abstract int initLayout();
@Override
protected void onDestroy() {
super.onDestroy();
if (p!=null){
p.onunAttach();
p=null;
}
}
}
BasePresenter抽取Presenter基类
public abstract class BasePresenter implements IContract.IPresenter {
public V v;
public void onAttach(V v){
this.v = v;
}
public void onunAttach(){
if (v!=null){
v=null;
}
}
}
Api
public interface ApiService {
@GET
Observable getInfo(@Url String url);
@GET
Observable getInfoParams(@Url String url, @QueryMap Map<String,Object> map);
@POST
Observable postInfoParams(@Url String url,@QueryMap Map<String,Object> map);
}
MyUrls
public interface MyUrls {
//店铺
String BASEURL=“http://blog.zhaoliang5156.cn/”;
//商品
String SHOPPING = “api/mall/shoppingcart.json”;
}
Icontract
public interface IContract {
interface MyCallBack{
void onSuccess(T t);
void onError(String error);
}
interface IModel{
void getInfo(String url, Class cls,MyCallBack myCallBack);
void getInfoParams(String url,Class cls,Map map,MyCallBack myCallBack);
void postInfoParams(String url,Class cls,Map map,MyCallBack myCallBack);
}
interface IView{
void onSuccess(T t);
void onError(String onError);
}
interface IPresenter{
void getInfo(String url,Class cls);
void getInfoParasms(String url,Class cls,Map map);
void postInfoParams(String url,Class cls,Map map);
}
}
网络工具类
public class MyUtil {
private final OkHttpClient okHttpClient;
private final Retrofit retrofit;
private final ApiService apiService;
private MyUtil(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(MyUrls.BASEURL)
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
}
private static class MyHolder{
private static MyUtil myUtil = new MyUtil();
}
public static MyUtil getInstance(){
return MyHolder.myUtil;
}
public void getInfo(String url, final Class cls, final MyCallBack myCallBack){
apiService.getInfo(url).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
Gson gson = new Gson();
try {
Object o = gson.fromJson(responseBody.string(), cls);
myCallBack.onSuccess(o);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
myCallBack.onError(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
public interface MyCallBack<T>{
void onSuccess(T t);
void onError(String error);
}
}
M层
public class MyModel implements IContract.IModel {
@Override
public void getInfo(String url, Class cls, final IContract.MyCallBack myCallBack) {
MyUtil.getInstance().getInfo(url, cls, new MyUtil.MyCallBack() {
@Override
public void onSuccess(Object o) {
myCallBack.onSuccess(o);
}
@Override
public void onError(String error) {
myCallBack.onError(error);
}
});
}
@Override
public void getInfoParams(String url, Class cls, Map map, IContract.MyCallBack myCallBack) {
}
@Override
public void postInfoParams(String url, Class cls, Map map, IContract.MyCallBack myCallBack) {
}
}
P层
public class MyPresenter extends BasePresenter {
MyModel myModel = new MyModel();
@Override
public void getInfo(String url, Class cls) {
myModel.getInfo(url, cls, new IContract.MyCallBack() {
@Override
public void onSuccess(Object o) {
v.onSuccess(o);
}
@Override
public void onError(String error) {
v.onError(error);
}
});
}
@Override
public void getInfoParasms(String url, Class cls, Map map) {
}
@Override
public void postInfoParams(String url, Class cls, Map map) {
}
}
MyBean
public class ShoppingBean {
/**
* code : 200
* orderData : [{"shopId":1,"shopName":"每日蔬鲜专卖店","cartlist":[{"id":1,"shopId":1,"shopName":"每日蔬鲜专卖店","defaultPic":"http://blog.zhaoliang5156.cn/api/images/%E8%8F%A0%E8%8F%9C.png","productId":1,"productName":"菠菜","color":"颜色:白色","meal":"套餐:默认套餐","price":3,"count":1},{"id":2,"shopId":1,"shopName":"每日蔬鲜专卖店","defaultPic":"http://blog.zhaoliang5156.cn/api/images/%E8%83%A1%E8%90%9D%E5%8D%9C.png","productId":2,"productName":"胡萝卜","color":"颜色:红色","meal":"套餐:默认套餐","price":4,"count":1}]},{"shopId":2,"shopName":"鸡蛋专卖店","cartlist":[{"id":1,"shopId":2,"shopName":"鸡蛋专卖店","defaultPic":"http://blog.zhaoliang5156.cn/api/images/%E9%B8%A1%E8%9B%8B.png","productId":1,"productName":"鸡蛋","color":"颜色:白色","meal":"套餐:默认套餐","price":10,"count":1}]}]
*/
private int code;
private List<OrderDataBean> orderData;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public List<OrderDataBean> getOrderData() {
return orderData;
}
public void setOrderData(List<OrderDataBean> orderData) {
this.orderData = orderData;
}
public static class OrderDataBean {
/**
* shopId : 1
* shopName : 每日蔬鲜专卖店
* cartlist : [{"id":1,"shopId":1,"shopName":"每日蔬鲜专卖店","defaultPic":"http://blog.zhaoliang5156.cn/api/images/%E8%8F%A0%E8%8F%9C.png","productId":1,"productName":"菠菜","color":"颜色:白色","meal":"套餐:默认套餐","price":3,"count":1},{"id":2,"shopId":1,"shopName":"每日蔬鲜专卖店","defaultPic":"http://blog.zhaoliang5156.cn/api/images/%E8%83%A1%E8%90%9D%E5%8D%9C.png","productId":2,"productName":"胡萝卜","color":"颜色:红色","meal":"套餐:默认套餐","price":4,"count":1}]
*/
private int shopId;
private String shopName;
private List<CartlistBean> cartlist;
private boolean groupFlag;
public boolean isGroupFlag() {
return groupFlag;
}
public void setGroupFlag(boolean groupFlag) {
this.groupFlag = groupFlag;
}
public int getShopId() {
return shopId;
}
public void setShopId(int shopId) {
this.shopId = shopId;
}
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public List<CartlistBean> getCartlist() {
return cartlist;
}
public void setCartlist(List<CartlistBean> cartlist) {
this.cartlist = cartlist;
}
public static class CartlistBean {
/**
* id : 1
* shopId : 1
* shopName : 每日蔬鲜专卖店
* defaultPic : http://blog.zhaoliang5156.cn/api/images/%E8%8F%A0%E8%8F%9C.png
* productId : 1
* productName : 菠菜
* color : 颜色:白色
* meal : 套餐:默认套餐
* price : 3
* count : 1
*/
private int id;
private int shopId;
private String shopName;
private String defaultPic;
private int productId;
private String productName;
private String color;
private String meal;
private int price;
private int count;
private boolean childFlag;
public boolean isChildFlag() {
return childFlag;
}
public void setChildFlag(boolean childFlag) {
this.childFlag = childFlag;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getShopId() {
return shopId;
}
public void setShopId(int shopId) {
this.shopId = shopId;
}
public String getShopName() {
return shopName;
}
public void setShopName(String shopName) {
this.shopName = shopName;
}
public String getDefaultPic() {
return defaultPic;
}
public void setDefaultPic(String defaultPic) {
this.defaultPic = defaultPic;
}
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getMeal() {
return meal;
}
public void setMeal(String meal) {
this.meal = meal;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
}
}
MainActivity
public class MainActivity extends BaseActivity {
ExpandableListView liste;
CheckBox box_big;
private MyPresenter myPresenter;
private List<ShoppingBean.OrderDataBean> slist = new ArrayList<>();
private MyAdapter myAdapter;
private boolean Flag;
@Override
protected void initData() {
myPresenter.getInfo(MyUrls.SHOPPING,ShoppingBean.class);
myAdapter = new MyAdapter(slist, MainActivity.this);
liste.setAdapter(myAdapter);
}
@Override
protected void initView() {
liste = findViewById(R.id.liste);
box_big = findViewById(R.id.box_big);
}
@Override
protected BasePresenter initPresenter() {
myPresenter = new MyPresenter();
return myPresenter;
}
@Override
protected int initLayout() {
return R.layout.activity_main;
}
@Override
public void onSuccess(final Object o) {
if (o instanceof ShoppingBean){
Log.i("aa", "onSuccess: " + o.toString());
slist.addAll(((ShoppingBean) o).getOrderData());
myAdapter.notifyDataSetChanged();
}
myAdapter.onClick(new MyAdapter.onCallBack() {
@Override
public void group(int groupPosition) {
slist.get(groupPosition).setGroupFlag(!slist.get(groupPosition).isGroupFlag());
for (int i = 0; i < slist.get(groupPosition).getCartlist().size(); i++) {
slist.get(groupPosition).getCartlist().get(i).setChildFlag(slist.get(groupPosition).isGroupFlag());
}
all();
myAdapter.notifyDataSetChanged();
}
@Override
public void child(int groupPosition, int childPosition) {
slist.get(groupPosition).getCartlist().get(childPosition).setChildFlag(!slist.get(groupPosition).getCartlist().get(childPosition).isChildFlag());
int num = 0;
for (int i = 0; i < slist.get(groupPosition).getCartlist().size(); i++) {
if (!slist.get(groupPosition).getCartlist().get(i).isChildFlag()){
break;
}
num++;
}
if (num == slist.get(groupPosition).getCartlist().size()){
slist.get(groupPosition).setGroupFlag(true);
}else {
slist.get(groupPosition).setGroupFlag(false);
}
all();
myAdapter.notifyDataSetChanged();
}
});
box_big.setChecked(Flag);
box_big.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
box_big.setChecked(!Flag);
Flag = !Flag;
for (int i = 0; i < slist.size(); i++) {
slist.get(i).setGroupFlag(Flag);
for (int j = 0; j <slist.get(i).getCartlist().size() ; j++) {
slist.get(i).getCartlist().get(j).setChildFlag(Flag);
}
}
myAdapter.notifyDataSetChanged();
}
});
}
private void all() {
int num = 0;
for (int i = 0; i < slist.size(); i++) {
if (!slist.get(i).isGroupFlag()){
break;
}
num++;
}
if (num ==slist.size()){
box_big.setChecked(true);
}else {
box_big.setChecked(false);
}
}
@Override
public void onError(String onError) {
}
}
MyAdapter
public class MyAdapter extends BaseExpandableListAdapter {
List<ShoppingBean.OrderDataBean> slist;
Context mContext;
public MyAdapter(List<ShoppingBean.OrderDataBean> slist, Context mContext) {
this.slist = slist;
this.mContext = mContext;
}
@Override
public int getGroupCount() {
return slist.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return slist.get(groupPosition).getCartlist().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) {
oneHolder holder;
if (convertView==null){
holder = new oneHolder();
convertView = View.inflate(mContext, R.layout.one_layout,null);
holder.box1 = convertView.findViewById(R.id.box1);
holder.te1 = convertView.findViewById(R.id.te1);
convertView.setTag(holder);
}else {
holder = (oneHolder) convertView.getTag();
}
holder.te1.setText(slist.get(groupPosition).getShopName()+"");
holder.box1.setChecked(slist.get(groupPosition).isGroupFlag());
holder.box1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callBack.group(groupPosition);
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
twoHolder holder;
if (convertView==null){
holder = new twoHolder();
convertView = View.inflate(mContext,R.layout.two_layout,null);
holder.box_one = convertView.findViewById(R.id.box_one);
holder.img = convertView.findViewById(R.id.img);
holder.te_one = convertView.findViewById(R.id.te_one);
holder.te_two = convertView.findViewById(R.id.te_two);
convertView.setTag(holder);
}else {
holder = (twoHolder) convertView.getTag();
}
Glide.with(mContext).load(slist.get(groupPosition).getCartlist().get(childPosition).getDefaultPic()).into(holder.img);
holder.te_one.setText(slist.get(groupPosition).getCartlist().get(childPosition).getShopName()+"");
holder.te_two.setText(slist.get(groupPosition).getCartlist().get(childPosition).getPrice()+"");
holder.box_one.setChecked(slist.get(groupPosition).getCartlist().get(childPosition).isChildFlag());
holder.box_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callBack.child(groupPosition,childPosition);
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
class oneHolder{
CheckBox box1;
TextView te1;
}
class twoHolder{
ImageView img;
TextView te_one;
TextView te_two;
CheckBox box_one;
}
onCallBack callBack;
public interface onCallBack{
void group(int groupPosition);
void child(int groupPosition,int childPosition);
}
public void onClick(onCallBack callBack) {
this.callBack = callBack;
}
}