Android 詳情頁跳轉購物車
阿新 • • 發佈:2019-02-03
1.新增依賴:
//recyclerView獲取資料 compile 'com.squareup.okhttp3:logging-interceptor:3.9.0' // fresco圖片載入 compile 'com.facebook.fresco:fresco:0.12.0' compile 'com.facebook.fresco:animated-gif:0.12.0' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'2.全選compile 'com.google.code.gson:gson:2.8.2' compile 'io.github.openfeign:feign-gson:9.5.1' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.github.bumptech.glide:glide:3.7.0'
<uses-permission android:name="android.permission.INTERNET"></uses-permission>3.Api:
public classApi { public static String DETAIL = "https://www.zhaoapi.cn/product/getProductDetail"; //詳情介面 public static String ADDCART = "https://www.zhaoapi.cn/product/addCart"; //新增購物車 public static String GETCART = "https://www.zhaoapi.cn/product/getCarts"; //獲得展示購物車(二級列表 需傳uid,pid)
public interfaceOnNetListener<T> { public void onSuccess(T t); public void onFailure(Exception e); }
public class HttpUtils { private static volatile HttpUtils httpUtils; private final OkHttpClient client; /** * 初始化Retrofit 單例模式 */ private HttpUtils(){ HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); client = new OkHttpClient.Builder() .addInterceptor(new MyInterceptor()) .build(); } //執行緒安全 public static HttpUtils getHttpUtils(){ if (httpUtils == null){ synchronized (HttpUtils.class){ if (httpUtils == null){ httpUtils = new HttpUtils(); } } } return httpUtils; } public void doGet(String url, Callback callback){ Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(callback); } public void doPost(String url, Map<String, String> params, Callback callback){ if (params == null) { throw new RuntimeException("引數為空了"); } FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } FormBody formBody = builder.build(); Request request = new Request.Builder().url(url).post(formBody).build(); client.newCall(request).enqueue(callback); } }
public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (request.method().equals("GET")){ String url = request.url().url().toString(); url += "&source=android"; Request newRequest = request.newBuilder().url(url).build(); return chain.proceed(newRequest); }else { FormBody formBody = (FormBody) request.body(); FormBody.Builder builder = new FormBody.Builder(); for (int i = 0; i <formBody.size(); i++){ builder.add(formBody.name(i), formBody.value(i)); } builder.add("source", "android"); FormBody newFormBody = builder.build(); Request newRequest = request.newBuilder().url(request.url().url().toString()).post(newFormBody).build(); return chain.proceed(newRequest); } } }Bean
public class PriceAndCount { private double price; private int count; public PriceAndCount(double price, int count) { this.price = price; this.count = count; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }詳情,新增,購物車Bean類\
4.view
public interface IMainListener { void show(DetailsBean detailsBean); void show(String str); }
public interface IMainListener { void show(DetailsBean detailsBean); void show(String str); }5.model
public interface DetailsService { void getProductDetail(Map<String, String> params, OnNetListener<DetailsBean> onNetListener); }
public class DetailsModel implements DetailsService { private Handler handler = new Handler(Looper.getMainLooper()); @Override public void getProductDetail(Map<String, String> params, final OnNetListener<DetailsBean> onNetListener) { HttpUtils.getHttpUtils().doPost(Api.DETAIL, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); final DetailsBean detailsBean = new Gson().fromJson(string, DetailsBean.class); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(detailsBean); } }); } }); } }
public interface AddCartService { void addCart(Map<String, String> params, OnNetListener<AddCartBean> onNetListener); }
public class AddCartModel implements AddCartService { private Handler handler = new Handler(Looper.getMainLooper()); @Override public void addCart(Map<String, String> params, final OnNetListener<AddCartBean> onNetListener) { HttpUtils.getHttpUtils().doPost(Api.ADDCART, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); final AddCartBean addCartBean = new Gson().fromJson(string, AddCartBean.class); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(addCartBean); } }); } }); } }
public interface GetCartService { void getCart(Map<String, String> params, OnNetListener<GetCartBean> onNetListener); }
public class GetCartModel implements GetCartService { private Handler handler = new Handler(Looper.getMainLooper()); @Override public void getCart(Map<String, String> params, final OnNetListener<GetCartBean> onNetListener) { HttpUtils.getHttpUtils().doPost(Api.GETCART, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); final GetCartBean getCartBean = new Gson().fromJson(string, GetCartBean.class); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(getCartBean); } }); } }); } }
public class DetailsPresenter { private IMainListener iMainListener; private DetailsService detailsService; public DetailsPresenter(IMainListener iMainListener) { this.iMainListener = iMainListener; detailsService = new DetailsModel(); } public void dettach() { iMainListener = null; } public void getProductDetail() { Map<String, String> params = new HashMap<>(); params.put("pid", "71"); detailsService.getProductDetail(params, new OnNetListener<DetailsBean>() { @Override public void onSuccess(DetailsBean detailsBean) { if (iMainListener != null) { iMainListener.show(detailsBean); } } @Override public void onFailure(Exception e) { } }); } }
public class AddCartPresenter { private IMainListener iMainListener; private AddCartService addCartService; public AddCartPresenter(IMainListener iMainListener) { this.iMainListener = iMainListener; addCartService = new AddCartModel(); } public void dettach() { iMainListener = null; } public void addCart() { Map<String, String> params = new HashMap<>(); params.put("pid", "71"); params.put("uid", "39"); addCartService.addCart(params, new OnNetListener<AddCartBean>() { @Override public void onSuccess(AddCartBean addCartBean) { if (iMainListener != null) { iMainListener.show(addCartBean.getCode().equals("0") ? "新增成功了" : "新增失敗了"); } } @Override public void onFailure(Exception e) { } }); } }
public class GetCartPresenter { private ISecondListener iSecondListener; private final GetCartService getCartService; public GetCartPresenter(ISecondListener iSecondListener) { this.iSecondListener = iSecondListener; getCartService = new GetCartModel(); } public void dettach() { iSecondListener = null; } public void getCart() { Map<String, String> params = new HashMap<>(); params.put("uid", "1234"); params.put("pid", "71"); getCartService.getCart(params, new OnNetListener<GetCartBean>() { @Override public void onSuccess(GetCartBean getCartBean) { if (iSecondListener != null) { List<GetCartBean.DataBean> group = getCartBean.getData(); List<List<GetCartBean.DataBean.ListBean>> child = new ArrayList<>(); for (int i = 0; i < group.size(); i++) { child.add(group.get(i).getList()); } iSecondListener.show(group, child); } } @Override public void onFailure(Exception e) { } }); } }MainActivity
/** * 詳情頁面 */ public class MainActivity extends AppCompatActivity implements IMainListener, View.OnClickListener{ private DetailsPresenter detailsPresenter; private ImageView mIv; private TextView mTvBargainPrice; private TextView mTvPrice; /** * 購物車 */ private TextView mTvCart; /** * 加入購物車 */ private TextView mTvAddCart; private AddCartPresenter addCartPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); detailsPresenter = new DetailsPresenter(this); addCartPresenter = new AddCartPresenter(this); detailsPresenter.getProductDetail(); } @Override protected void onDestroy() { super.onDestroy(); detailsPresenter.dettach(); addCartPresenter.dettach(); } @Override public void show(DetailsBean detailsBean) { String images = detailsBean.getData().getImages(); String[] split = images.split("\\|"); Glide.with(this).load(split[0]).into(mIv); TextPaint paint = mTvBargainPrice.getPaint(); paint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG); mTvBargainPrice.setText("原價:" + detailsBean.getData().getBargainPrice()); mTvPrice.setText("優惠價:" + detailsBean.getData().getPrice()); } @Override public void show(String str) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); } private void initView() { mIv = (ImageView) findViewById(R.id.iv); mTvBargainPrice = (TextView) findViewById(R.id.tvBargainPrice); mTvPrice = (TextView) findViewById(R.id.tvPrice); mTvCart = (TextView) findViewById(R.id.tvCart); mTvAddCart = (TextView) findViewById(R.id.tvAddCart); mTvCart.setOnClickListener(this); mTvAddCart.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.tvCart: Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); break; case R.id.tvAddCart: addCartPresenter.addCart(); break; } } }SecondActivity
public class SecondActivity extends AppCompatActivity implements ISecondListener { private GetCartPresenter getCartPresenter; private ExpandableListView mElv; /** * 全選 */ private CheckBox mCb; /** * 合計: */ private TextView mTvTotal; /** * 去結算(0) */ private TextView mTvCount; private ElvAdapter elvAdapter; private GetCartBean bean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); getCartPresenter = new GetCartPresenter(this); getCartPresenter.getCart(); mCb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { elvAdapter.AllOrNone(mCb.isChecked()); } }); } @Override protected void onDestroy() { super.onDestroy(); getCartPresenter.dettach(); } @Override public void show(List<GetCartBean.DataBean> group, List<List<GetCartBean.DataBean.ListBean>> child) { elvAdapter = new ElvAdapter(this, group, child); mElv.setGroupIndicator(null); mElv.setAdapter(elvAdapter); for (int i = 0; i < group.size(); i++) { mElv.expandGroup(i); } } private void initView() { mElv = (ExpandableListView) findViewById(R.id.elv); mCb = (CheckBox) findViewById(R.id.cb); mTvTotal = (TextView) findViewById(R.id.tvTotal); mTvCount = (TextView) findViewById(R.id.tvCount); } public void setPriceAndCount(PriceAndCount priceAndCount) { mTvTotal.setText("合計:" + priceAndCount.getPrice()); mTvCount.setText("去結算(" + priceAndCount.getCount() + ")"); } public void setAllChecked(boolean bool) { mCb.setChecked(bool); } }ElvAdapter
public class ElvAdapter extends BaseExpandableListAdapter { private Context context; private List<GetCartBean.DataBean> group; private List<List<GetCartBean.DataBean.ListBean>> child; private final LayoutInflater inflater; //建立大的集合 private List<GetCartBean.DataBean.ListBean> list; //存放商家的id和商家的名稱的map集合 private Map<String,String> map = new HashMap<>(); public ElvAdapter(Context context, List<GetCartBean.DataBean> group, List<List<GetCartBean.DataBean.ListBean>> child) { this.context = context; this.group = group; this.child = child; inflater = LayoutInflater.from(context); } @Override public int getGroupCount() { return