请求网络的权限
<uses-permission android:name="android.permission.INTERNET"/>
依赖
compile 'com.squareup.okhttp3:okhttp:3.10.0' compile 'com.google.code.gson:gson:2.2.4' compile 'com.github.bumptech.glide:glide:3.7.0'
布局
activity_main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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="com.example.slx.slx_329.view.MainActivity" android:orientation="vertical"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp"> <CheckBox android:id="@+id/cb" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="全选" /> <TextView android:id="@+id/price" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="总价:"/> <TextView android:id="@+id/tv_totalPrice" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="0"/> <Button android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="结算"/> </LinearLayout> </LinearLayout>
itemlayout
<?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="match_parent" android:orientation="horizontal"> <CheckBox android:layout_gravity="center" android:id="@+id/lv_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/lv_img" android:layout_gravity="center" android:layout_width="100dp" android:layout_height="100dp" /> <LinearLayout android:orientation="vertical" android:layout_gravity="center" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content"> <TextView android:id="@+id/lv_title" android:text="标题" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/lv_price" android:text="价格:0.0" android:layout_width="120dp" android:layout_height="wrap_content" /> <Button android:id="@+id/lv_jian" android:layout_width="40dp" android:layout_height="40dp" android:text="-"/> <TextView android:id="@+id/lv_num" android:layout_width="40dp" android:layout_height="40dp" android:text="0"/> <Button android:id="@+id/lv_jia" android:layout_width="40dp" android:layout_height="40dp" android:text="+"/> </LinearLayout> </LinearLayout> <Button android:id="@+id/lv_remove" android:layout_gravity="center" android:layout_width="80dp" android:layout_height="wrap_content" android:text="删除"/> </LinearLayout>
utils
package com.example.slx.dome.utils; import android.os.Environment; import java.io.File; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import static android.R.string.ok; import static android.os.Build.VERSION_CODES.M; /** * Created by Administrator on 2018/3/8. */ public class OkhtttpUtils { //单例模式,把构造方法进行私有化 // private OkhtttpUtils(){}; static OkHttpClient client; public static OkHttpClient getInstance(){ if (client==null) { //更加安全 synchronized (OkhtttpUtils.class) { //缓存的地方 mnt/sdcard File file = new File(Environment.getExternalStorageDirectory(), "cache11"); client = new OkHttpClient().newBuilder() .readTimeout(3000, TimeUnit.SECONDS) //设置读取超时时间 .connectTimeout(3000, TimeUnit.SECONDS) //设置连接的超时时间 .cache(new Cache(file, 10 * 1024)) .build(); } } return client; } /** * get请求 * Callback 是一个接口 */ public static void doGet(String url, Callback callback){ //1:拿到okhttpclient 对像 OkHttpClient client = getInstance(); //2:进行请求的操作 Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(callback); } //post请求 /** * * @param url 请求的地址 * @param parms 请求的参数 * @param callback callback */ public static void doPost(String url, Map<String,String> parms,Callback callback){ //得到客户端的对像 OkHttpClient client = getInstance(); //不是FormBody,而是一个Builder FormBody.Builder body = new FormBody.Builder(); //key value for (String key:parms.keySet()){ //value的值 body.add(key,parms.get(key)); } Request request = new Request.Builder() .url(url) .post(body.build()) .build(); client.newCall(request).enqueue(callback); } //用来上传图片的 //url , 图片 ,参数 Callback public static void upImage(String url,File file,String filenName,Map<String,String> params,Callback callback){ OkHttpClient client = getInstance(); //requestBody的实现类 Formbody MultipartBody.Builder builder = new MultipartBody.Builder(); if (params!=null){ for (String key :params.keySet()){ builder.addFormDataPart(key,params.get(key)); } } //设置类型 builder.setType(MultipartBody.FORM); builder.addFormDataPart("file",filenName,RequestBody.create(MediaType.parse("application/octet-stream"),file)); // builder.setType(MultipartBody.FORM); // builder.addFormDataPart("file",filenName,RequestBody.create(MediaType.parse("application/octet-stream"),file)); //builder.addFormDataPart("file","aa.png",builder.build()); Request request = new Request.Builder() .url(url) .post(builder.build()) .build(); client.newCall(request).enqueue(callback); } }
view层
public interface IView { void toBackHome(List<ShopData.DataBean> list); }
package com.example.slx.dome.view; import android.annotation.SuppressLint; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ListView; import android.widget.TextView; import com.example.slx.dome.R; import com.example.slx.dome.adapter.MyAdapter; import com.example.slx.dome.model.bean.ShopData; import com.example.slx.dome.persenter.MyPersenter; import java.util.List; public class MainActivity extends AppCompatActivity implements IView,MyAdapter.Change{ private ListView listView; private TextView price; private CheckBox checkBox; private MyAdapter adapter; String dataUrl ="https://www.zhaoapi.cn/product/getProducts?pscid=1"; private List<ShopData.DataBean> list; @SuppressLint("HandlerLeak") Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); list=(List<ShopData.DataBean>)msg.obj; //给定义的flag赋值 for (int i = 0; i <list.size() ; i++) { list.get(i).setFlag(false); } //4.1实例化一个接口对象 adapter = new MyAdapter(MainActivity.this,list); listView.setAdapter(adapter); //4.2传到对象内部 adapter.getChange(MainActivity.this); getMoney(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.lv); price = findViewById(R.id.price); checkBox = findViewById(R.id.cb); checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { for (int i = 0; i <list.size() ; i++) { list.get(i).setFlag(b); } adapter.notifyDataSetChanged(); getMoney(); } }); MyPersenter myPersenter = new MyPersenter(this); myPersenter.newWork(dataUrl); } @Override public void toBackHome(List<ShopData.DataBean> list) { Message message = Message.obtain(); message.obj=list; handler.sendMessage(message); } @Override public void changeMoney() { getMoney(); } public void jiaNum(){ getMoney(); } public void jianNum(){ getMoney(); } public void delete(){ getMoney(); } //得到总价的方法 private void getMoney() { double zon=0; for (int i = 0; i <list.size() ; i++) { ShopData.DataBean dataBean = list.get(i); boolean flag = dataBean.isFlag(); if (flag){ double price = dataBean.getPrice(); int sellerid = dataBean.getSellerid(); zon+=price*sellerid; } } price.setText("总价:"+zon); } }
persenter层
public interface Ipersenter { void success(List<ShopData.DataBean> list); void error(); void newWork(String dataUrl); }
package com.example.slx.dome.persenter; import com.example.slx.dome.model.MyModel; import com.example.slx.dome.model.bean.ShopData; import com.example.slx.dome.view.IView; import java.util.List; /** * Created by lenovo on 2018/4/1. */ public class MyPersenter implements Ipersenter{ private final MyModel myModel; private IView iView; public MyPersenter(IView iView){ this.iView=iView; myModel = new MyModel(); } @Override public void success(List<ShopData.DataBean> list) { iView.toBackHome(list); } @Override public void error() { } @Override public void newWork(String dataUrl) { myModel.getData(dataUrl,this); } }
model层
public interface Imodel { void getData(String dataUrl, Ipersenter ipersenter); }
package com.example.slx.dome.model; import com.example.slx.dome.model.bean.ShopData; import com.example.slx.dome.persenter.Ipersenter; import com.example.slx.dome.utils.OkhtttpUtils; import com.google.gson.Gson; import java.io.IOException; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; /** * Created by lenovo on 2018/4/1. */ public class MyModel implements Imodel{ @Override public void getData(String dataUrl, final Ipersenter ipersenter) { OkhtttpUtils.doGet(dataUrl, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String json = response.body().string(); Gson gson = new Gson(); ShopData shopData = gson.fromJson(json, ShopData.class); List<ShopData.DataBean> list = shopData.getData(); ipersenter.success(list); } }); } }
adapter
package com.example.slx.dome.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.slx.dome.R; import com.example.slx.dome.model.bean.ShopData; import java.util.List; /** * Created by lenovo on 2018/4/1. */ public class MyAdapter extends BaseAdapter{ //2.提供一个接口对象 private Change change; public String imgUrl = "https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg"; private Context context; private List<ShopData.DataBean> list; public MyAdapter(Context context, List<ShopData.DataBean> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(final int i, View convertView, ViewGroup viewGroup) { final ViewHolder holder; if(convertView==null){ convertView = View.inflate(context, R.layout.itemlayout, null); holder=new ViewHolder(); holder.lv_checkbox = convertView.findViewById(R.id.lv_checkbox); holder.lv_img = convertView.findViewById(R.id.lv_img); holder.lv_title = convertView.findViewById(R.id.lv_title); holder.lv_jia = convertView.findViewById(R.id.lv_jia); holder.lv_jian = convertView.findViewById(R.id.lv_jian); holder.lv_remove = convertView.findViewById(R.id.lv_remove); holder.lv_num = convertView.findViewById(R.id.lv_num); holder.lv_price = convertView.findViewById(R.id.lv_price); convertView.setTag(holder); }else { holder=(ViewHolder)convertView.getTag(); } holder.lv_title.setText(list.get(i).getTitle()); Glide.with(context).load(imgUrl).into(holder.lv_img); holder.lv_price.setText("价格:"+list.get(i).getPrice()); holder.lv_num.setText(list.get(i).getSellerid()+""); holder.lv_checkbox.setChecked(list.get(i).isFlag()); //给checkbox一个点击事件,让他显示商品的价格 holder.lv_checkbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.get(i).setFlag(!list.get(i).isFlag()); //添加一个触发事件 change.changeMoney(); } }); // holder.lv_jia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int sellerid = list.get(i).getSellerid(); sellerid++; list.get(i).setSellerid(sellerid); notifyDataSetChanged(); change.jiaNum(); } }); holder.lv_jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int sellerid = list.get(i).getSellerid(); if (sellerid==1){ holder.lv_jian.setFocusable(false); }else { sellerid--; } list.get(i).setSellerid(sellerid); notifyDataSetChanged(); change.jianNum(); } }); holder.lv_remove.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.remove(i); notifyDataSetChanged(); change.delete(); } }); return convertView; } public class ViewHolder{ TextView lv_title,lv_num,lv_price; Button lv_remove,lv_jian,lv_jia; ImageView lv_img; CheckBox lv_checkbox; } //1.定义一个接口 public interface Change{ void changeMoney(); void jiaNum(); void jianNum(); void delete(); } //3.提供一个为接口对象赋值的方法 public void getChange(Change change){ this.change = change; } }