首页 分类 购物车

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

圆形搜索框

main_activity.xml布局(这是fragment)

   <TextView
       android:id="@+id/show"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:gravity="center"
       android:text="首页"
       android:textSize="20sp"
       />

   <TextView
       android:id="@+id/fenlei"
       android:layout_width="131dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:gravity="center"
       android:text="分类"
       android:textSize="20sp" />
   <TextView
       android:id="@+id/shop"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:gravity="center"
       android:text="购物"
       android:textSize="20sp"
       />

mainactivity页面(实现fragment)

package com.umeng.soexample.a1121day19;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.umeng.soexample.a1121day19.fragment.FenleiFragment;
import com.umeng.soexample.a1121day19.fragment.ShopFragment;
import com.umeng.soexample.a1121day19.fragment.ShouyeFragment;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView show;
private TextView fenlei;
private TextView shop;
private ViewPager vp;
private List list;
private List mFragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=findViewById(R.id.show);
fenlei=findViewById(R.id.fenlei);
shop=findViewById(R.id.shop);
vp=findViewById(R.id.vp);
list=new ArrayList<>();
mFragments=new ArrayList<>();
mFragments.add(new ShouyeFragment());
mFragments.add(new FenleiFragment());
mFragments.add(new ShopFragment());

    show.setOnClickListener(this);
    fenlei.setOnClickListener(this);
    shop.setOnClickListener(this);
    vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
        @Override
        public Fragment getItem(int position) {
            return mFragments.get(position);
        }

        @Override
        public int getCount() {
            return mFragments.size();
        }
    });

}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.show:
            vp.setCurrentItem(0);
            break;
        case R.id.fenlei:
            vp.setCurrentItem(1);
            break;
        case R.id.shop:
            vp.setCurrentItem(2);
            break;
    }
}

}

然后是三个fragment页面的功能实现

首页的布局

<?xml version="1.0" encoding="utf-8"?>



<android.support.v7.widget.RecyclerView
android:id="@+id/recyview"
android:layout_width=“match_parent”
android:layout_height=“wrap_content”></android.support.v7.widget.RecyclerView>

先是固定的httputils

utils包的HttpUtils页面

package com.umeng.soexample.a1121day19.utils;

import android.os.Handler;

import com.google.gson.Gson;
import com.umeng.soexample.a1121day19.callback.ICallBcak;

import java.io.IOException;
import java.lang.reflect.Type;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**

  • Created by lenovo on 2018-11-21.
    */

public class HttpUtils {
private static volatile HttpUtils instance;

private OkHttpClient client;

private Handler handler = new Handler();

private  HttpUtils(){
    client=new OkHttpClient();
}

public static HttpUtils getInstance(){
    if (instance == null){
        synchronized (HttpUtils.class){
            if (null == instance){
                instance = new HttpUtils();
            }
        }
    }
    return instance;
}
public void get(String url, final ICallBcak callBack, final Type type){
    Request request = new Request.Builder()
            .url(url)
            .get()
            .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, final IOException e) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onFailed(e);
                }
            });
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String string = response.body().string();
            Gson gson = new Gson();
            final Object o = gson.fromJson(string, type);

            handler.post(new Runnable() {
                @Override
                public void run() {
                    callBack.onSuccess(o);
                }
            });

        }
    });
}

}
固定的callback

callback包里的ICallBack页面

package com.umeng.soexample.a1121day19.callback;

/**

  • Created by lenovo on 2018-11-21.
    */

public interface ICallBcak {
void onSuccess(Object o);
void onFailed(Exception e);
}

接下来是首页的mvp

frist包里的model presenter view

NewsModel页面

package com.umeng.soexample.a1121day19.frist.model;

import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.utils.HttpUtils;

import java.lang.reflect.Type;

/**

  • Created by lenovo on 2018-11-21.
    */

public class NewsModel {
public void getNews(String url, ICallBcak callBack, Type type){
HttpUtils.getInstance().get(url,callBack,type);
}
}

NewsPresenter页面

package com.umeng.soexample.a1121day19.frist.presenter;

import com.google.gson.reflect.TypeToken;
import com.umeng.soexample.a1121day19.bean.News;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.frist.model.NewsModel;
import com.umeng.soexample.a1121day19.frist.view.IView;

import java.lang.reflect.Type;

/**

  • Created by lenovo on 2018-11-21.
    */

public class NewsPresenter {
private IView iv;
private NewsModel newsModel;

public void attach(IView iv) {
    this.iv = iv;
    newsModel = new NewsModel();
}

public void get(){

    Type type = new TypeToken<News>(){}.getType();

    newsModel.getNews("http://www.xieast.com/api/news/news.php", new ICallBcak() {
        @Override
        public void onSuccess(Object o) {
            News newsBean = (News) o;
            if (newsBean != null){
                iv.onSuccess(newsBean.getData());
            }
        }

        @Override
        public void onFailed(Exception e) {
            iv.onFailed(e);
        }
    },type);
}

}

NewsView页面

package com.umeng.soexample.a1121day19.frist.view;

import com.umeng.soexample.a1121day19.bean.News;

import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public interface IView {
void onSuccess(List<News.DataBean> list);

void onFailed(Exception e);

}

bean包里的News实现接口

adapter包里的NewsAdapter

package com.umeng.soexample.a1121day19.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.News;

import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder>{
private Context context;
private List<News.DataBean> list;

public NewsAdapter(Context context, List<News.DataBean> list) {
    this.context = context;
    this.list = list;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v=View.inflate(context, R.layout.item_news,null);
    ViewHolder holder=new ViewHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Glide.with(context).load(list.get(position).getThumbnail_pic_s()).into(holder.img);
    holder.title.setText(list.get(position).getTitle());
}

@Override
public int getItemCount() {
    return list.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    private ImageView img;
    private TextView title;

    public ViewHolder(View itemView) {
        super(itemView);
        img=itemView.findViewById(R.id.img);
        title=itemView.findViewById(R.id.title);
    }
}

}

NewsAdapter里的布局item_news

<?xml version="1.0" encoding="utf-8"?>


<ImageView
android:id="@+id/img"
android:layout_width=“175dp”
android:layout_height=“200dp”

    />
<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    />

显示首页的数据页面首页fragment页面

package com.umeng.soexample.a1121day19.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.adapter.NewsAdapter;
import com.umeng.soexample.a1121day19.bean.News;
import com.umeng.soexample.a1121day19.frist.presenter.NewsPresenter;
import com.umeng.soexample.a1121day19.frist.view.IView;

import java.util.ArrayList;
import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public class ShouyeFragment extends Fragment implements IView{
private RecyclerView recyview;
private NewsAdapter adapter;
private List<News.DataBean> listBeans;
private NewsPresenter presenter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.shouye_fragment, null, false);
recyview= v.findViewById(R.id.recyview);
return v;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    RecyclerView.LayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
    recyview.setLayoutManager(manager);
    listBeans = new ArrayList<>();
    adapter = new NewsAdapter(getActivity(),listBeans);
    recyview.setAdapter(adapter);
    presenter = new NewsPresenter();
    presenter.attach(this);
    presenter.get();
}

@Override
public void onSuccess(List<News.DataBean> list) {
    if (list != null){
        listBeans.clear();
        listBeans.addAll(list);
        adapter.notifyDataSetChanged();
    }
}

@Override
public void onFailed(Exception e) {
    Toast.makeText(getActivity(),"错误",Toast.LENGTH_LONG).show();
}

}
加权限首页面完成

第二个分类功能

分类的布局

<?xml version="1.0" encoding="utf-8"?>


    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_main"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"></android.support.v7.widget.RecyclerView>

    <ScrollView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="8">

        <LinearLayout
            android:id="@+id/ll_next"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"></LinearLayout>
    </ScrollView>
</LinearLayout>

分类的mvp创建

classify包里的 model presenter view

Model页面

package com.umeng.soexample.a1121day19.classify.model;

import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.utils.HttpUtils;

import java.lang.reflect.Type;

/**

  • Created by lenovo on 2018-11-21.
    */

public class Model {
public void getSuccess(String url, ICallBcak callBack, Type type){
HttpUtils.getInstance().get(url,callBack,type);
}
}

ClassifyPresenter页面

package com.umeng.soexample.a1121day19.classify.presenter;

import com.google.gson.reflect.TypeToken;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.classify.model.Model;
import com.umeng.soexample.a1121day19.classify.view.ClassifyView;

import java.lang.reflect.Type;

/**

  • Created by lenovo on 2018-11-21.
    */

public class ClassifyPresenter {
private ClassifyView cv;
private Model model;

public void attach(ClassifyView cv) {
    this.cv = cv;
    model = new Model();
}
public void detch() {
    if (cv != null) {
        cv = null;
    }
}
public void getMainclassify(){
    Type type = new TypeToken<MainClassifyBean>(){}.getType();
    model.getSuccess("http://www.zhaoapi.cn/product/getCatagory", new ICallBcak() {
        @Override
        public void onSuccess(Object o) {
            MainClassifyBean mainClassifyBean = (MainClassifyBean) o;
            if (mainClassifyBean != null){
                cv.getMainClassify(mainClassifyBean.getData());
            }
        }

        @Override
        public void onFailed(Exception e) {
            cv.getFailed(e);
        }

    },type);
}

public void getNextClassify(String url){
    Type type = new TypeToken<NextClassifyBean>(){}.getType();
    model.getSuccess(url, new ICallBcak() {
        @Override
        public void onSuccess(Object o) {
            NextClassifyBean nextClassifyBean = (NextClassifyBean) o;
            if (nextClassifyBean != null){
                cv.getNextClassify(nextClassifyBean.getData());
            }
        }

        @Override
        public void onFailed(Exception e) {
            cv.getFailed(e);
        }
    },type);
}

}

ClassifyView页面

package com.umeng.soexample.a1121day19.classify.view;

import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;

import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public interface ClassifyView {
void getMainClassify(List<MainClassifyBean.DataBean> list);

void getNextClassify(List<NextClassifyBean.DataBean> list);

void getFailed(Exception e);

}
mvp写完 开始 Adapter

MainClassifyAdapter页面

package com.umeng.soexample.a1121day19.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;

import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public class MainClassifyAdapter extends RecyclerView.Adapter<MainClassifyAdapter.ViewHolder>{
private Context context;
private List<MainClassifyBean.DataBean> list;

public MainClassifyAdapter(Context context, List<MainClassifyBean.DataBean> list) {
    this.context = context;
    this.list = list;
}
public interface OnItemClicklistener{
    void onItemClick(View itemView,int position);
}
private OnItemClicklistener clicklistener;

public void getOnItemClicklistener(OnItemClicklistener clicklistener){
    this.clicklistener = clicklistener;
}
@NonNull
@Override
public MainClassifyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v=  View.inflate(context, R.layout.mainclassify_item,null);
    ViewHolder holder=new ViewHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull MainClassifyAdapter.ViewHolder holder, final int position) {
    holder.txtTitle.setText(list.get(position).getName());

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (clicklistener != null){
                clicklistener.onItemClick(v,position);
            }
        }
    });

}

@Override
public int getItemCount() {
    return list.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    private TextView txtTitle;
    public ViewHolder(View itemView) {
        super(itemView);
        txtTitle=itemView.findViewById(R.id.txt_title);
    }
}

}

mainclassifyadapter里的布局mainclassify_item

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/txt_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:layout_marginTop="10dp"
    android:layout_marginBottom="10dp"
    android:textSize="20dp" />

NextClassifyAdapter页面

package com.umeng.soexample.a1121day19.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;

import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public class NextClassifyAdapter extends RecyclerView.Adapter<NextClassifyAdapter.ViewHolder>{
private Context context;
private List<NextClassifyBean.DataBean.ListBean> list;

public NextClassifyAdapter(Context context, List<NextClassifyBean.DataBean.ListBean> list) {
    this.context = context;
    this.list = list;
}

@NonNull
@Override
public NextClassifyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = View.inflate(context, R.layout.nextclassify_item, null);
    ViewHolder holder=new ViewHolder(v);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull NextClassifyAdapter.ViewHolder holder, int position) {
    Glide.with(context).load(list.get(position).getIcon()).into(holder.imgNext);
    holder.txtNext.setText(list.get(position).getName());
}

@Override
public int getItemCount() {
    return list.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    private ImageView imgNext;
    private TextView txtNext;
    public ViewHolder(View itemView) {
        super(itemView);
        imgNext = itemView.findViewById(R.id.img_next);
        txtNext = itemView.findViewById(R.id.txt_next);
    }
}

}

NextClassifyAdapter里的布局nextclassify_item

<?xml version="1.0" encoding="utf-8"?>

<ImageView
    android:id="@+id/img_next"
    android:layout_width="50dp"
    android:layout_height="50dp" />

<TextView
    android:id="@+id/txt_next"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

分类 fenleifragment页面

package com.umeng.soexample.a1121day19.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.adapter.MainClassifyAdapter;
import com.umeng.soexample.a1121day19.adapter.NextClassifyAdapter;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;
import com.umeng.soexample.a1121day19.classify.presenter.ClassifyPresenter;
import com.umeng.soexample.a1121day19.classify.view.ClassifyView;

import java.util.ArrayList;
import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public class FenleiFragment extends Fragment implements ClassifyView{
private RecyclerView rvMain;
private LinearLayout llNext;
private MainClassifyAdapter mainClassifyAdapter;
private NextClassifyAdapter nextClassifyAdapter;
private List<MainClassifyBean.DataBean> mainList;
private ClassifyPresenter presenter;
private List<NextClassifyBean.DataBean> nextList;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fenlei_fragment, null, false);
rvMain = v.findViewById(R.id.rv_main);
llNext = v.findViewById(R.id.ll_next);
return v;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    initView();
    initData();
}
private void initData() {
    mainClassifyAdapter.getOnItemClicklistener(new MainClassifyAdapter.OnItemClicklistener() {
        @Override
        public void onItemClick(View itemView, int position) {
            MainClassifyBean.DataBean dataBean = mainList.get(position);
            presenter.getNextClassify("http://www.zhaoapi.cn/product/getProductCatagory?cid="+dataBean.getCid());
        }
    });
}
private void initView() {
    mainList = new ArrayList<>();
    nextList = new ArrayList<>();
    mainClassifyAdapter = new MainClassifyAdapter(getContext(),mainList);
    RecyclerView.LayoutManager manager = new LinearLayoutManager(getContext());
    rvMain.setLayoutManager(manager);
    rvMain.setAdapter(mainClassifyAdapter);
    presenter = new ClassifyPresenter();
    presenter.attach(this);
    presenter.getMainclassify();
}

@Override
public void getMainClassify(List<MainClassifyBean.DataBean> list) {
    if (list != null){
        mainList.clear();
        mainList.addAll(list);
        mainClassifyAdapter.notifyDataSetChanged();
    }
}

@Override
public void getNextClassify(List<NextClassifyBean.DataBean> list) {
    if (list != null){
        llNext.removeAllViews();
        for (int i = 0; i <list.size() ; i++) {
            TextView textView = new TextView(getContext());
            textView.setText(list.get(i).getName());
            RecyclerView recyclerView = new RecyclerView(getContext());
            RecyclerView.LayoutManager manager = new GridLayoutManager(getContext(),3);
            recyclerView.setLayoutManager(manager);
            nextClassifyAdapter = new NextClassifyAdapter(getContext(),list.get(i).getList());
            recyclerView.setAdapter(nextClassifyAdapter);

            nextList.clear();
            nextList.addAll(list);

            nextClassifyAdapter.notifyDataSetChanged();

            llNext.addView(textView);
            llNext.addView(recyclerView);

        }
    }
}

@Override
public void getFailed(Exception e) {
    Toast.makeText(getContext(),"网络连接错误",Toast.LENGTH_SHORT).show();
}

@Override
public void onResume() {
    super.onResume();
    presenter.getNextClassify("http://www.zhaoapi.cn/product/getProductCatagory?cid=1");
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (presenter != null){
        presenter.detch();
    }
}

}

第三个功能购物车

shop_fragment布局

<?xml version="1.0" encoding="utf-8"?>










adapter里的MyAdapter是购物车的adapter

MyAdapter页面

package com.umeng.soexample.a1121day19.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.umeng.soexample.a1121day19.MyAddSubView;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.CartInfo;

import java.util.List;

/**

  • Created by lenovo on 2018-11-21.
    */

public class MyAdapter extends BaseExpandableListAdapter{
private List<CartInfo.DataBean> sellerData;
private Context context;

public MyAdapter(List<CartInfo.DataBean> sellerData, Context context) {
    this.sellerData = sellerData;
    this.context = context;
}

@Override
public int getGroupCount() {
    return sellerData.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return sellerData.get(groupPosition).getList().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) {
    GroupViewHolder groupViewHolder = null;
    if (convertView == null){
        groupViewHolder = new GroupViewHolder();
        convertView = View.inflate(context, R.layout.group_view_layout_shopcar, null);
        groupViewHolder.cb_group_item = convertView.findViewById(R.id.cb_group_item);
        groupViewHolder.tv_title_group = convertView.findViewById(R.id.tv_title_group);
        convertView.setTag(groupViewHolder);
    }else {
        groupViewHolder = (GroupViewHolder) convertView.getTag();
    }
    //赋值
    CartInfo.DataBean dataBean = sellerData.get(groupPosition);
    //商家名称
    groupViewHolder.tv_title_group.setText(dataBean.getSellerName());
    boolean b = isCurrentSellerAllProductSelected(groupPosition);
    //商家的checkbox
    groupViewHolder.cb_group_item.setChecked(b);
    //点击checkbox触发监听
    groupViewHolder.cb_group_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (onCartListChangeListener != null) {
                onCartListChangeListener.SellerSelectedChange(groupPosition);
            }
        }
    });
    return convertView;
}
public void changeCurrentSellerAllProductSelected(int Position, boolean b) {
    List<CartInfo.DataBean.ListBean> list = sellerData.get(Position).getList();
    for (int i = 0; i < list.size(); i++) {
        list.get(i).setSelected(b ? 1 : 0);

    }

}
public boolean isCurrentSellerAllProductSelected(int position) {
    List<CartInfo.DataBean.ListBean> list = sellerData.get(position).getList();
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).getSelected() == 0) {
            return false;
        }
    }
    return true;
}

/////////////////////////////////////////////////////

@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    ChildViewHolder childViewHolder = null;
    if (convertView == null) {
        childViewHolder = new ChildViewHolder();
        convertView = View.inflate(context, R.layout.child_view_layout_shopcar, null);
        childViewHolder.cb_child_item = convertView.findViewById(R.id.cb_child_item);
        childViewHolder.tv_title_child = convertView.findViewById(R.id.tv_title_child);
        childViewHolder.tv_price_child = convertView.findViewById(R.id.tv_price_child);
        childViewHolder.iv_icon_child = convertView.findViewById(R.id.iv_icon_child);
        childViewHolder.add_sub_view_child = convertView.findViewById(R.id.add_sub_view_child);
        convertView.setTag(childViewHolder);
    } else {
        childViewHolder = (ChildViewHolder) convertView.getTag();
    }
    //赋值
    CartInfo.DataBean.ListBean listBean = sellerData.get(groupPosition).getList().get(childPosition);
    //商品名称
    childViewHolder.tv_title_child.setText(listBean.getTitle());
    //商品图片
    String images = listBean.getImages();
    String[] split = images.split("\\|");
    Glide.with(context).load(split[0]).into(childViewHolder.iv_icon_child);
    //商品价格
    childViewHolder.tv_price_child.setText("¥" + listBean.getPrice());
    //商品checkb0x
    childViewHolder.cb_child_item.setChecked(listBean.getSelected() == 1);
    childViewHolder.cb_child_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onCartListChangeListener.changeCurrentProductSelected(groupPosition, childPosition);
        }
    });

    childViewHolder.add_sub_view_child.setOnNumberChangeListener(new MyAddSubView.OnNumberChangeListener() {
        @Override
        public void OnNumberChange(int number) {
            onCartListChangeListener.ProductNumberChange(groupPosition, childPosition, number);
        }
    });
    return convertView;
}

public void changeCurrentProductNumber(int groupPosition, int childPosition, int number) {
    CartInfo.DataBean.ListBean listBean = sellerData.get(groupPosition).getList().get(childPosition);
    listBean.setNum(number);
}
public void changeCurrentProductSelected(int groupPosition, int childPosition) {
    CartInfo.DataBean.ListBean listBean = sellerData.get(groupPosition).getList().get(childPosition);
    listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0);


}
public double calculateTotalPrice() {
    double totalPrice = 0;
    for (int i = 0; i < sellerData.size(); i++) {
        List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            //只有选中采取计算
            if (list.get(j).getSelected() == 1) {
                double price = list.get(j).getPrice();
                int num = list.get(j).getNum();
                totalPrice += price * num;
            }

        }
    }
    return totalPrice;
}
public int calculateTotalNumber() {
    int totalNumber = 0;
    for (int i = 0; i < sellerData.size(); i++) {
        List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            //只有选中采取计算
            if (list.get(j).getSelected() == 1) {
                int num = list.get(j).getNum();
                totalNumber += num;
            }

        }
    }
    return totalNumber;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
}
public boolean isAllProductsSelected() {
    for (int i = 0; i < sellerData.size(); i++) {
        List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            if (list.get(j).getSelected() == 0) {
                return false;
            }
        }
    }
    return true;
}
public void changeAllProductsSelected(boolean b) {
    for (int i = 0; i < sellerData.size(); i++) {
        List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            list.get(j).setSelected(b ? 1 : 0);
        }
    }

}
public static class GroupViewHolder {

    public CheckBox cb_group_item;
    public TextView tv_title_group;
}
public static class ChildViewHolder {

    public CheckBox cb_child_item;
    public ImageView iv_icon_child;
    public TextView tv_title_child;
    public TextView tv_price_child;
    public MyAddSubView add_sub_view_child;
}

OnCartListChangeListener onCartListChangeListener;
public void setOnCartListChangeListener(OnCartListChangeListener onCartListChangeListener) {
    this.onCartListChangeListener = onCartListChangeListener;
}
public interface OnCartListChangeListener {
    void SellerSelectedChange(int groupPosition);

    void changeCurrentProductSelected(int groupPosition, int childPosition);

    void ProductNumberChange(int groupPosition, int childPosition, int number);
}

}

MyAdapter里的布局

group_view_layout_shopcar布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android
android:layout_width=“match_parent”
android:layout_height=“60dp”
android:orientation=“horizontal”

>
<CheckBox
    android:id="@+id/cb_group_item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<TextView
    android:id="@+id/tv_title_group"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:ellipsize="end"
    android:maxLines="2"
    android:text="标题"
    android:textColor="#000"
    android:textSize="20sp"
    />

child_view_layout_shopcar布局

<?xml version="1.0" encoding="utf-8"?>






</LinearLayout>

///////////导自己的包/////

<com.umeng.soexample.a1121day19.MyAddSubView
android:id="@+id/add_sub_view_child"
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”></com.umeng.soexample.a1121day19.MyAddSubView>

然后是自定义控件加减器

add_sub_view布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android
android:layout_width=“80dp”
android:layout_height=“30dp”
android:layout_gravity=“center_vertical”
android:orientation=“horizontal”
android:background="#000"
android:padding=“2dp”

>
<TextView
    android:id="@+id/tv_sub_view"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="#fff"
    android:gravity="center"
    android:text="-"
    android:textColor="#000"
    />
<TextView
    android:id="@+id/tv_number_view"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_marginLeft="2dp"
    android:layout_marginRight="2dp"
    android:layout_weight="1"
    android:background="#fff"
    android:gravity="center"
    android:text="1"
    android:textColor="#000"

    />
<TextView
    android:id="@+id/tv_add_view"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="#fff"
    android:gravity="center"
    android:text="+"
    android:textColor="#000"
    />

MyAddSubView页面

package com.umeng.soexample.a1121day19;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

/**

  • Created by lenovo on 2018-11-21.
    */

public class MyAddSubView extends LinearLayout implements View.OnClickListener{

TextView tv_sub_view;
TextView tv_number_view;
TextView tv_add_view;
private int number = 1;


public int getNumber(){
    return number;
}
public void setNumber(int number){
    this.number=number;
    tv_number_view.setText(number+"");
}
public MyAddSubView(Context context) {
    super(context);
}

//////////////////////
public MyAddSubView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View inflate = View.inflate(context, R.layout.add_sub_view,this);
tv_sub_view = inflate.findViewById(R.id.tv_sub_view);
tv_number_view = inflate.findViewById(R.id.tv_number_view);
tv_add_view = inflate.findViewById(R.id.tv_add_view);
tv_add_view.setOnClickListener(this);
tv_sub_view.setOnClickListener(this);

}

OnNumberChangeListener onNumberChangeListener;
public void setOnNumberChangeListener(OnNumberChangeListener onNumberChangeListener){
this.onNumberChangeListener=onNumberChangeListener;
}

@Override
public void onClick(View v) {

}

public interface  OnNumberChangeListener{
    void OnNumberChange(int number);
}

}

shopfragment页面

package com.umeng.soexample.a1121day19.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;

import com.google.gson.Gson;
import com.umeng.soexample.a1121day19.MainActivity;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.adapter.MyAdapter;
import com.umeng.soexample.a1121day19.bean.CartInfo;

import java.io.IOException;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**

  • Created by lenovo on 2018-11-21.
    */

public class ShopFragment extends Fragment implements View.OnClickListener{
public static final String TAG = “ShopFragment”;
String url = “http://www.zhaoapi.cn/product/getCarts?uid=71”;
private ExpandableListView elc_show_main;
private CheckBox cb_allCheck_main;
private TextView btn_allPrice_main;
private Button btn_allNumber_main;
private MyAdapter myAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.shop_fragment, null, false);
elc_show_main = v.findViewById(R.id.elc_show_main);
cb_allCheck_main = v.findViewById(R.id.cb_allCheck_main);
btn_allPrice_main = v.findViewById(R.id.btn_allprice_main);
btn_allNumber_main =v.findViewById(R.id.btn_allNumber_main);
cb_allCheck_main.setOnClickListener(this);
btn_allNumber_main.setOnClickListener(this);
initData();
return v;
}

private void initData() {
    //得到okhttp
    OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
    Request request = new Request.Builder().url(url).build();
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(final Call call, Response response) throws IOException {
            final String string = response.body().string();
      getActivity().runOnUiThread( new Runnable() {

          private List<CartInfo.DataBean> sellerData;

          @Override
          public void run() {
              Gson gson = new Gson();
              CartInfo cartInfo = gson.fromJson(string, CartInfo.class);
              sellerData = cartInfo.getData();

              //创建适配
              //创建适配
              myAdapter = new MyAdapter(sellerData,getActivity());
              //调用适配器的借口 来实现回电数据
              myAdapter.setOnCartListChangeListener(new MyAdapter.OnCartListChangeListener() {

                  @Override
                  public void SellerSelectedChange(int groupPosition) {
                      //先得到 checkbox
                      boolean b = myAdapter.isCurrentSellerAllProductSelected(groupPosition);
                      //改变所有当前商家的选中状态
                      myAdapter.changeCurrentSellerAllProductSelected(groupPosition,!b);
                      myAdapter.notifyDataSetChanged();
                      refreshAllSelectedAndTotalPriceAndTotalNumber();

                  }

                  @Override
                  public void changeCurrentProductSelected(int groupPosition, int childPosition) {
                      myAdapter.changeCurrentProductSelected(groupPosition,childPosition);
                      myAdapter.notifyDataSetChanged();
                      refreshAllSelectedAndTotalPriceAndTotalNumber();
                  }

                  @Override
                  public void ProductNumberChange(int groupPosition, int childPosition, int number) {
                      myAdapter.changeCurrentProductNumber(groupPosition,childPosition,number);
                      myAdapter.notifyDataSetChanged();
                      //刷新底部的方法
                      refreshAllSelectedAndTotalPriceAndTotalNumber();
                  }
              });

              elc_show_main.setAdapter(myAdapter);
              for (int i = 0; i < sellerData.size() ; i++) {
                  elc_show_main.expandGroup(i);

              }
          }
      });
        }
    });
}
private void  refreshAllSelectedAndTotalPriceAndTotalNumber(){

    boolean allProductsSelected = myAdapter.isAllProductsSelected();
    cb_allCheck_main.setChecked(allProductsSelected);

//计算总金额
Double totalPrice = myAdapter.calculateTotalPrice();
btn_allPrice_main.setText(“总价:¥”+totalPrice);
//计算总数量
int totalNumber = myAdapter.calculateTotalNumber();
btn_allNumber_main.setText(“去结算(”+totalNumber+")");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_allNumber_main:

            break;
        case R.id.cb_allCheck_main:
            boolean allProductsSelected = myAdapter.isAllProductsSelected();
            myAdapter.changeAllProductsSelected(!allProductsSelected);
            myAdapter.notifyDataSetChanged();
            //刷新底部的方法
            refreshAllSelectedAndTotalPriceAndTotalNumber();
            break;

    }
}

}

猜你喜欢

转载自blog.csdn.net/chuanchuandaxia/article/details/84334612