布局---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?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:orientation="vertical" android:layout_height="match_parent" tools:context="com.example.com.shopping.view.MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/lv"> </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" > <CheckBox android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/che" android:text="全选"/> <TextView android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="总价:"/> <TextView android:id="@+id/tv_total" 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:id="@+id/btn" android:text="结算"/> </LinearLayout> </LinearLayout>
子布局----------------------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:id="@+id/checkbox"/> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/img" android:layout_marginLeft="40dp" android:layout_toRightOf="@id/che"/> <LinearLayout android:layout_width="200dp" android:layout_height="wrap_content" android:id="@+id/li" android:layout_toRightOf="@id/img" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_title" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_price"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-" android:id="@+id/jian"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2" android:id="@+id/tv_num"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+" android:id="@+id/jia"/> </LinearLayout> </LinearLayout> </RelativeLayout>
view层里mainactivity--------------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.view; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.example.com.shopping.R; import com.example.com.shopping.adapter.MyAdapter; import com.example.com.shopping.moudle.Bean.ShoppingBean; import com.example.com.shopping.presenter.MyDataPersenter; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements DataView,MyAdapter.NumInterface{ String dataUrl ="https://www.zhaoapi.cn/product/getProducts?pscid=1"; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); list = (List<ShoppingBean.DataBean>) msg.obj; myAdapter = new MyAdapter(MainActivity.this, list); lv.setAdapter(myAdapter); myAdapter.setShopping(MainActivity.this); //Toast.makeText(MainActivity.this,"aa",Toast.LENGTH_SHORT).show(); } }; private ListView lv; private TextView tv_total; private CheckBox che; private List<ShoppingBean.DataBean> list; private MyAdapter myAdapter; private int prices=0; private int nums=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = findViewById(R.id.lv); MyDataPersenter persenter=new MyDataPersenter(this); persenter.netWork(dataUrl); tv_total = findViewById(R.id.tv_total); che = findViewById(R.id.che); che.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (che.isChecked()){ for (int x=0;x<list.size();x++){ list.get(x).setCheck(true); quanxuan(x,list.get(x).isCheck()); } myAdapter.notifyDataSetChanged(); }else { for (int x=0;x<list.size();x++){ list.get(x).setCheck(false); quanxuan(x,list.get(x).isCheck()); } myAdapter.notifyDataSetChanged(); } } }); } private void changePrice(){ prices=0; nums=0; for(int x=0;x<list.size();x++){ ShoppingBean.DataBean dataBean=list.get(x); if ( dataBean.isCheck()){ nums++; prices+=list.get(x).getPrice()*list.get(x).getSalenum(); } } tv_total.setText(prices+""); } public void jia(int i,TextView tv,Boolean ischeck){ int salenum = list.get(i).getSalenum(); salenum++; list.get(i).setSalenum(salenum); myAdapter.notifyDataSetChanged(); changePrice(); } public void jian(int i,TextView tv,Boolean ischeck){ int salenum = list.get(i).getSalenum(); if (salenum==1){ return; } salenum--; list.get(i).setSalenum(salenum); myAdapter.notifyDataSetChanged(); changePrice(); } public void quanxuan(int i,boolean ischeck){ ShoppingBean.DataBean dataBean = list.get(i); dataBean.setCheck(ischeck); changePrice(); } @Override public void toBackHome(List<ShoppingBean.DataBean> list) { Message msg = new Message(); msg.obj=list; Log.d("--", "toBackHome: "+list.size()); handler.sendMessage(msg); } }
dataview'-----------------------------------------------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.view; import com.example.com.shopping.moudle.Bean.ShoppingBean; import java.util.List; /** * Created by linmeihui on 2018/3/29. */ public interface DataView { void toBackHome( List<ShoppingBean.DataBean> list); }‘
moudle层里datamoudle-----------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.moudle; import com.example.com.shopping.presenter.DataPresenter; /** * Created by linmeihui on 2018/3/29. */ public interface DataMoudle { void getData(String url,DataPresenter presenter); }
mydataview----------------------------------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.moudle; import com.example.com.shopping.Utils.OkhtttpUtils; import com.example.com.shopping.moudle.Bean.ShoppingBean; import com.example.com.shopping.presenter.DataPresenter; import com.google.gson.Gson; import java.io.IOException; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; /** * Created by linmeihui on 2018/3/29. */ public class MyDataMoudle implements DataMoudle { //请求数据的 @Override public void getData(String url, final DataPresenter presenter) { //请求数据 OkhtttpUtils.doGet(url, 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(); ShoppingBean shoppingBean = gson.fromJson(json, ShoppingBean.class); //得到数据 List<ShoppingBean.DataBean> list=shoppingBean.getData(); //回调给p层 presenter.success(list); } }); } }
presenter层里datapresenter
package com.example.com.shopping.presenter; import com.example.com.shopping.moudle.Bean.ShoppingBean; import java.util.List; /** * Created by linmeihui on 2018/3/29. */ public interface DataPresenter { void success(List<ShoppingBean.DataBean> list); void error(); }
mydatapresenter--------------------------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.presenter; import com.example.com.shopping.moudle.Bean.ShoppingBean; import com.example.com.shopping.moudle.MyDataMoudle; import com.example.com.shopping.view.DataView; import com.example.com.shopping.view.MainActivity; import java.util.List; /** * Created by linmeihui on 2018/3/29. */ public class MyDataPersenter implements DataPresenter { private MyDataMoudle myDataMoudle; DataView dataView; public MyDataPersenter(DataView dataView) { myDataMoudle=new MyDataMoudle(); this.dataView=dataView; } //Moudle层得到数据 传给view层 @Override public void success(List<ShoppingBean.DataBean> list) { dataView.toBackHome(list); } @Override public void error() { } //请求数据的方法 public void netWork(String dataUrl) { myDataMoudle.getData(dataUrl,this); } }
utils工具类 okhttputils--------------------------------------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.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); } }
myadapter------------------------------------------------------------------------------------------------------------------------------------
package com.example.com.shopping.adapter; import android.content.Context; import android.graphics.Bitmap; 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.com.shopping.R; import com.example.com.shopping.moudle.Bean.ShoppingBean; import com.example.com.shopping.view.MainActivity; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import java.util.List; /** * Created by linmeihui on 2018/3/29. */ public class MyAdapter extends BaseAdapter{ Context context; List<ShoppingBean.DataBean> list; NumInterface numInterface; public MyAdapter(Context context, List<ShoppingBean.DataBean> list) { this.context = context; this.list = list; } public void setShopping(NumInterface numInterface){ this.numInterface=numInterface; } @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 view, ViewGroup viewGroup) { final ViewHolder holder; if (view==null){ view=View.inflate(context, R.layout.item,null); holder=new ViewHolder(); holder.checkbox=view.findViewById(R.id.checkbox); holder.img=view.findViewById(R.id.img); holder.jia=view.findViewById(R.id.jia); holder.jian=view.findViewById(R.id.jian); holder.tv_num=view.findViewById(R.id.tv_num); holder.tv_price=view.findViewById(R.id.tv_price); holder.tv_title=view.findViewById(R.id.tv_title); holder.tv_total=view.findViewById(R.id.tv_total); view.setTag(holder); }else{ holder= (ViewHolder) view.getTag(); } String imageUrl ="https://img-my.csdn.net/uploads/201407/26/1406383264_4787.jpg"; holder.tv_title.setText(list.get(i).getTitle()); holder.tv_price.setText(list.get(i).getPrice()+""); holder.tv_num.setText(list.get(i).getSalenum()+""); holder.checkbox.setChecked(list.get(i).isCheck()); Glide.with(context).load(imageUrl).into(holder.img); ShoppingBean.DataBean dataBean=list.get(i); if (dataBean.isCheck()){ dataBean.setCheck(true); }else { dataBean.setCheck(false); } holder.checkbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.get(i).setCheck(holder.checkbox.isChecked()); numInterface.quanxuan(i,holder.checkbox.isChecked()); } }); holder.jia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { numInterface.jia(i,holder.tv_num,holder.checkbox.isChecked()); } }); holder.jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { numInterface.jian(i,holder.tv_num,holder.checkbox.isChecked()); } }); return view; } class ViewHolder{ CheckBox checkbox; Button jia,jian; TextView tv_title,tv_price,tv_num,tv_total; ImageView img; } public interface NumInterface{ void jia(int i,TextView tv,Boolean ischeck); void jian(int i,TextView tv,Boolean ischeck); void quanxuan(int i,boolean ischeck); } }