请求网络的权限
<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;
}
}