依赖
compile 'com.squareup.okhttp3:okhttp:3.10.0' compile 'com.android.support:recyclerview-v7:26.1.0' //黄油刀 compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' //图片加载框架 compile 'com.facebook.fresco:fresco:0.12.0' //访问网络 implementation 'com.squareup.retrofit2:retrofit:2.4.0' compile 'com.squareup.retrofit2:converter-gson:2.4.0' //compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' //RxJava implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.1.12' compile 'com.github.userswlwork:pull-to-refresh:1.0.0' compile 'com.jcodecraeer:xrecyclerview:1.3.2' compile 'org.greenrobot:greendao:3.2.2' implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' compile 'com.github.bumptech.glide:glide:3.7.0'
权限
<uses-permission android:name="android.permission.INTERNET"/>
<application android:name=".application.MyApplication">布局
<?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" android:orientation="vertical" tools:context="com.example.slx.songliangxing1511r20180423.MainActivity"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/rv"> </android.support.v7.widget.RecyclerView> <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>
<?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" /> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" android:id="@+id/lv_img"/> <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>
bean
public class MessageBean<T>{ private String msg; private String code; private List<T> data; private String page;
public class Goods { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; private Boolean flag;
utils
package com.example.slx.songliangxing1511r20180423.utils; import com.example.slx.songliangxing1511r20180423.http.ApiService; import com.example.slx.songliangxing1511r20180423.http.ServiceUrl; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by lenovo on 2018/4/23. */ public class HttpNetUtils { private static volatile HttpNetUtils instance; private final Retrofit retrofit; public static HttpNetUtils getInstance(){ if(instance==null){ synchronized (HttpNetUtils.class){ if(null==instance){ instance=new HttpNetUtils(); } } } return instance; } private HttpNetUtils(){ HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .build(); retrofit = new Retrofit.Builder() .baseUrl(ServiceUrl.BASE_URL) .client(client) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } public ApiService getService(){ return retrofit.create(ApiService.class); } }
http
package com.example.slx.songliangxing1511r20180423.http; /** * Created by lenovo on 2018/4/23. */ public class ServiceUrl { public static final String BASE_URL = "https://www.zhaoapi.cn/product/"; }
package com.example.slx.songliangxing1511r20180423.http; import com.example.slx.songliangxing1511r20180423.bean.Goods; import com.example.slx.songliangxing1511r20180423.bean.MessageBean; import io.reactivex.Flowable; import retrofit2.http.GET; import retrofit2.http.Query; /** * Created by lenovo on 2018/4/23. */ public interface ApiService { @GET("getProducts") Flowable<MessageBean<Goods>> getGoodsData(@Query("pscid")String pscid); }
inter
package com.example.slx.songliangxing1511r20180423.inter; import com.example.slx.songliangxing1511r20180423.bean.Goods; import com.example.slx.songliangxing1511r20180423.bean.MessageBean; /** * Created by lenovo on 2018/4/23. */ public interface IPresenter { void netWork(String pscid); void success(MessageBean<Goods> goodsMessageBean); }
package com.example.slx.songliangxing1511r20180423.inter; import com.example.slx.songliangxing1511r20180423.bean.Goods; import com.example.slx.songliangxing1511r20180423.bean.MessageBean; /** * Created by lenovo on 2018/4/23. */ public interface IView { void toBackHome(MessageBean<Goods> goodsMessageBean); }
view层
package com.example.slx.songliangxing1511r20180423; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import com.example.slx.songliangxing1511r20180423.adapter.MyAdapter; import com.example.slx.songliangxing1511r20180423.bean.Goods; import com.example.slx.songliangxing1511r20180423.bean.MessageBean; import com.example.slx.songliangxing1511r20180423.inter.IPresenter; import com.example.slx.songliangxing1511r20180423.inter.IView; import com.example.slx.songliangxing1511r20180423.presenter.MyPresenter; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements IView,MyAdapter.Change{ @BindView(R.id.rv) RecyclerView rv; @BindView(R.id.cb) CheckBox cb; @BindView(R.id.price) TextView price; @BindView(R.id.tv_totalPrice) TextView tvTotalPrice; private List<Goods> list; private MyAdapter adapter; private CheckBox checkBox; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); 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(); } }); //设置布局文件 rv.setLayoutManager(new LinearLayoutManager(this)); //创建p层对象 IPresenter myPresenter = new MyPresenter(this); myPresenter.netWork("2"); } @Override public void toBackHome(MessageBean<Goods> goodsMessageBean) { list = goodsMessageBean.getData(); //给定义的flag赋值,默认false for (int i = 0; i <list.size();i++) { list.get(i).setFlag(false); } //4.1实例化一个接口对象 adapter = new MyAdapter(list,MainActivity.this); rv.setAdapter(adapter); //4.2传到对象内部 adapter.getChange(MainActivity.this); getMoney(); } public void changeMoney() { getMoney(); } public void jiaNum(){ getMoney(); } public void jianNum(){ getMoney(); } public void delete(){ getMoney(); } public void getMoney() { double zon=0; for (int i = 0; i <list.size() ; i++) { Goods goods = list.get(i); boolean flag = goods.getFlag(); if (flag){ double price = goods.getPrice(); int sellerid = goods.getSellerid(); zon+=price*sellerid; } } price.setText("总价:"+zon); } }
p层
package com.example.slx.songliangxing1511r20180423.presenter; import com.example.slx.songliangxing1511r20180423.bean.Goods; import com.example.slx.songliangxing1511r20180423.bean.MessageBean; import com.example.slx.songliangxing1511r20180423.inter.IPresenter; import com.example.slx.songliangxing1511r20180423.inter.IView; import com.example.slx.songliangxing1511r20180423.model.MyModel; /** * Created by lenovo on 2018/4/23. */ public class MyPresenter implements IPresenter{ private IView iView; private final MyModel myModel; public MyPresenter(IView iView){ this.iView=iView; myModel = new MyModel(); } @Override public void netWork(String pscid) { myModel.getData(pscid,this); } @Override public void success(MessageBean<Goods> goodsMessageBean) { iView.toBackHome(goodsMessageBean); } }
m层
package com.example.slx.songliangxing1511r20180423.model; import com.example.slx.songliangxing1511r20180423.bean.Goods; import com.example.slx.songliangxing1511r20180423.bean.MessageBean; import com.example.slx.songliangxing1511r20180423.http.ApiService; import com.example.slx.songliangxing1511r20180423.inter.IPresenter; import com.example.slx.songliangxing1511r20180423.utils.HttpNetUtils; import io.reactivex.Flowable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import io.reactivex.subscribers.DisposableSubscriber; /** * Created by lenovo on 2018/4/23. */ public class MyModel { public void getData(String pscid, final IPresenter iPresenter) { HttpNetUtils instance = HttpNetUtils.getInstance(); ApiService service = instance.getService(); //得到被观察者 Flowable<MessageBean<Goods>> goodsData = service.getGoodsData(pscid); goodsData.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DisposableSubscriber<MessageBean<Goods>>() { @Override public void onNext(MessageBean<Goods> goodsMessageBean) { iPresenter.success(goodsMessageBean); } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }); } }
adapter
package com.example.slx.songliangxing1511r20180423.adapter; import android.content.Context; import android.net.Uri; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.slx.songliangxing1511r20180423.R; import com.example.slx.songliangxing1511r20180423.bean.Goods; import java.net.URL; import java.util.List; /** * Created by lenovo on 2018/4/23. */ public class MyAdapter extends RecyclerView.Adapter{ //2.提供一个接口对象 private Change change; private List<Goods> list; private Context context; public MyAdapter(List<Goods> list, Context context) { this.list = list; this.context = context; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(parent.getContext(), R.layout.itemlayout, null); // LayoutInflater from = LayoutInflater.from(context); // View view = from.inflate(R.layout.itemlayout, parent, false); //创建ViewHolder 把view通过构造方法传过去 MyViewHolder myViewHolder = new MyViewHolder(view); return myViewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { final MyViewHolder myViewHolder = (MyViewHolder) holder; //得到标题 myViewHolder.lv_title.setText(list.get(position).getTitle()); //得到图片 String[] split = list.get(position).getImages().split("!"); Uri uri = Uri.parse(split[0]); myViewHolder.lv_img.setImageURI(uri); //得到价格 myViewHolder.lv_price.setText("价格"+list.get(position).getPrice()); //得到数量 myViewHolder.lv_num.setText(list.get(position).getSellerid()+""); //加 myViewHolder.lv_jia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int sellerid = list.get(position).getSellerid(); sellerid++; list.get(position).setSellerid(sellerid); notifyDataSetChanged(); change.jiaNum(); } }); //减 myViewHolder.lv_jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int sellerid = list.get(position).getSellerid(); if (sellerid==1){ myViewHolder.lv_jian.setFocusable(false); }else { sellerid--; } list.get(position).setSellerid(sellerid); notifyDataSetChanged(); change.jianNum(); } }); myViewHolder.lv_remove.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.remove(position); notifyDataSetChanged(); change.delete(); } }); myViewHolder.lv_checkbox.setChecked(list.get(position).getFlag()); myViewHolder.lv_checkbox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.get(position).setFlag(!list.get(position).getFlag()); //添加一个触发事件 change.changeMoney(); } }); } @Override public int getItemCount() { return list.size(); } //内部类创建V,在此方法中,寻找控件 class MyViewHolder extends RecyclerView.ViewHolder{ private final TextView lv_title; private CheckBox lv_checkbox; private ImageView lv_img; private Button lv_jia; private Button lv_jian; private Button lv_remove; private TextView lv_num; private TextView lv_price; public MyViewHolder(View view) { super(view); lv_title = view.findViewById(R.id.lv_title); lv_checkbox = view.findViewById(R.id.lv_checkbox); lv_img = view.findViewById(R.id.lv_img); lv_jia = view.findViewById(R.id.lv_jia); lv_jian = view.findViewById(R.id.lv_jian); lv_remove = view.findViewById(R.id.lv_remove); lv_num = view.findViewById(R.id.lv_num); lv_price = view.findViewById(R.id.lv_price); } } //1.定义一个接口 public interface Change{ void changeMoney(); void jiaNum(); void jianNum(); void delete(); } //3.提供一个为接口对象赋值的方法 public void getChange(Change change){ this.change = change; } }
application
package com.example.slx.songliangxing1511r20180423.application; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; /** * Created by lenovo on 2018/4/23. */ public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }