MVp+RXJava+Retrofit+RecyclerView展示首页和详情页
添加依赖 compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'com.google.code.gson:gson:2.8.1' compile 'com.android.support:recyclerview-v7:26.+' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.squareup.okio:okio:1.13.0' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile 'com.facebook.fresco:fresco:0.12.0' compile 'com.youth.banner:banner:1.4.9' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.jakewharton:butterknife:7.0.1' testCompile 'junit:junit:4.12' compile 'org.greenrobot:eventbus:3.1.1'
public class Api { public static final String PATH = "http://120.27.23.105/"; }
public class MyBean {
private String msg; private String code; private TuijianBean tuijian; private MiaoshaBean miaosha; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public TuijianBean getTuijian() { return tuijian; } public void setTuijian(TuijianBean tuijian) { this.tuijian = tuijian; } public MiaoshaBean getMiaosha() { return miaosha; } public void setMiaosha(MiaoshaBean miaosha) { this.miaosha = miaosha; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class TuijianBean {
private String name; private List<ListBean> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<ListBean> getList() { return list; } public void setList(List<ListBean> list) { this.list = list; } public static class ListBean {
private int 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; public int getBargainPrice() { return bargainPrice; } public void setBargainPrice(int bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } public static class MiaoshaBean {
private String name; private int time; private List<ListBeanX> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } public List<ListBeanX> getList() { return list; } public void setList(List<ListBeanX> list) { this.list = list; } public static class ListBeanX {
private int 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; public int getBargainPrice() { return bargainPrice; } public void setBargainPrice(int bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } public static class DataBean {
private int aid; private String createtime; private String icon; private Object productId; private String title; private int type; private String url; public int getAid() { return aid; } public void setAid(int aid) { this.aid = aid; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public Object getProductId() { return productId; } public void setProductId(Object productId) { this.productId = productId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
public class XQBean {
private String msg; private SellerBean seller; private String code; private DataBean data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public SellerBean getSeller() { return seller; } public void setSeller(SellerBean seller) { this.seller = seller; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public static class SellerBean {
private String description; private String icon; private String name; private int productNums; private int score; private int sellerid; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getProductNums() { return productNums; } public void setProductNums(int productNums) { this.productNums = productNums; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } } public static class DataBean {
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; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }
public interface ApiService { @GET("ad/getAd") Observable<MyBean> getdatas(); //商品详情 @FormUrlEncoded @POST("product/getProductDetail") Observable<XQBean> getGoodsInfo(@Field("pid") String pid, @Field("source") String source); }
public class App extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
public interface IView { void showList(List<MyBean.TuijianBean.ListBean> list); void showError(String e); }
public interface OnRequestListener { void OnSuccess(List<MyBean.TuijianBean.ListBean> list); void OnError(String e); }
public interface IModel { void RequestData(String url,OnRequestListener onRequestListener); }
public class Model implements IModel { @Override public void RequestData(String url, final OnRequestListener onRequestListener) { //retrofit网络请求 Retrofit retrofit = new Retrofit .Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); //结合rxjava Observable<MyBean> getdatas = apiService.getdatas(); getdatas.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<MyBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onRequestListener.OnError(e.getMessage().toString()); } @Override public void onNext(MyBean myBean) { List<MyBean.TuijianBean.ListBean> list = myBean.getTuijian().getList(); onRequestListener.OnSuccess(list); } }); } }
public interface IPresenter { void loadList(String url); }
public class Presenter implements IPresenter { private IView iView; private IModel iModel; public Presenter(IView iView) { this.iView = iView; iModel = new Model(); } @Override public void loadList(String url) { iModel.RequestData(url, new OnRequestListener() { @Override public void OnSuccess(List<MyBean.TuijianBean.ListBean> list) { iView.showList(list); } @Override public void OnError(String e) { iView.showError(e); } }); } }
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<MyBean.TuijianBean.ListBean> list; public MyAdapter(Context context, List<MyBean.TuijianBean.ListBean> list) { this.context = context; this.list = list; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_my, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(MyAdapter.ViewHolder holder, final int position) { String images = list.get(position).getImages(); String[] split = images.split("\\|"); holder.img.setImageURI(split[0]); holder.title.setText(list.get(position).getTitle()); holder.price.setText("¥"+list.get(position).getPrice()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EventBus.getDefault().postSticky(new MessageEvent(list.get(position).getPid()+"")); Intent intent = new Intent(context, SecondActivity.class); context.startActivity(intent); } }); } @Override public int getItemCount() { return list.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public SimpleDraweeView img; public TextView title,price; public ViewHolder(View itemView) { super(itemView); img=itemView.findViewById(R.id.item_img); title=itemView.findViewById(R.id.title); price=itemView.findViewById(R.id.price); } } }
public class MessageEvent { String pid; public MessageEvent(String pid) { this.pid = pid; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } }
public class MainActivity extends AppCompatActivity implements IView{ @Bind(R.id.recycler) RecyclerView recycler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this); recycler.setLayoutManager(linearLayoutManager); Presenter presenter = new Presenter(this); presenter.loadList(Api.PATH); } @Override public void showList(List<MyBean.TuijianBean.ListBean> list) { MyAdapter myAdapter = new MyAdapter(MainActivity.this, list); recycler.setAdapter(myAdapter); } @Override public void showError(String e) { } }
public class SecondActivity extends AppCompatActivity{ @Bind(R.id.goodsImg) ImageView goodsImg; @Bind(R.id.goodsTitle) TextView goodsTitle; @Bind(R.id.bargainPrice) TextView bargainPrice; @Bind(original_price) TextView originalPrice; @Bind(R.id.salenum) TextView salenum; @Bind(R.id.change) RelativeLayout change; @Bind(R.id.gongyingshang) TextView gongyingshang; @Bind(R.id.dianpu) TextView dianpu; @Bind(R.id.guanzhu) CheckBox guanzhu; @Bind(R.id.gouwuche) TextView gouwuche; @Bind(R.id.add_Buy) Button addBuy; private String pid; // private int pid; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); ButterKnife.bind(this); EventBus.getDefault().register(this); // EventBus.getDefault().register(XiangQing.this); Retrofit retrofit = new Retrofit.Builder().baseUrl(Api.PATH) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); Observable<XQBean> goodsInfo = apiService.getGoodsInfo(pid,"android"); goodsInfo.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<XQBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(XQBean xqBean) { String[] images = xqBean.getData().getImages().split("\\|"); Glide.with(SecondActivity.this).load(images[0]).into(goodsImg); goodsTitle.setText(xqBean.getData().getTitle()); bargainPrice.setText("¥"+xqBean.getData().getBargainPrice()); originalPrice.setText("原价 "+xqBean.getData().getPrice()); originalPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); salenum.setText("销量" +xqBean.getData().getSalenum()); } }); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessage(MessageEvent event) { pid = event.getPid(); Toast.makeText(this, "pid"+ pid, Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
activity_main
<android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler"></android.support.v7.widget.RecyclerView>
activity_second
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.lx_20171220_2.view.SecondActivity"> <ImageView android:id="@+id/goodsImg" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2"> </ImageView> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"> <TextView android:id="@+id/goodsTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="20dp" android:ellipsize="end" android:maxLines="2" android:text=" 【雅欧国际】:所有商品全新原装正品" android:textSize="17sp" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/bargainPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" android:text="¥10000.00" android:textColor="#ff0000" android:textSize="22sp" /> <TextView android:id="@+id/original_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginTop="5dp" android:text="原价¥10000.00" android:textColor="#690606" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="35dp"> <TextView android:id="@+id/salenum" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:layout_marginRight="15dp" android:text="销量 : 0" android:textSize="15sp" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/change" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择尺寸,颜色分类"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=">" android:textSize="24sp" android:layout_marginRight="10dp" android:layout_alignParentRight="true"/> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="35dp" android:layout_marginTop="10dp" android:background="@color/View_BG"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:layout_marginRight="15dp" android:drawableLeft="@drawable/checked" android:drawablePadding="5dp" android:text="全国 有货" android:textSize="15sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginRight="20dp" android:drawableLeft="@drawable/checked" android:textSize="15sp" android:text="免运费"/> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#4a4747" /> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp"> <TextView android:id="@+id/gongyingshang" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="15dp" android:layout_marginTop="5dp" android:layout_weight="1" android:button="@null" android:drawablePadding="5dp" android:drawableTop="@drawable/a96" android:gravity="center" android:text="供应商" android:textColor="#6b6868" android:textSize="15sp" /> <TextView android:id="@+id/dianpu" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="15dp" android:layout_marginTop="5dp" android:layout_weight="1" android:button="@null" android:drawablePadding="5dp" android:drawableTop="@drawable/at2" android:gravity="center" android:text="店铺" android:textColor="#6b6868" android:textSize="15sp" /> <CheckBox android:id="@+id/guanzhu" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="15dp" android:layout_marginTop="2dp" android:layout_weight="1" android:button="@null" android:drawablePadding="5dp" android:drawableTop="@drawable/guanzhu_ck" android:gravity="center" android:text="关注" android:textColor="#6b6868" android:textSize="15sp" /> <TextView android:id="@+id/gouwuche" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="15dp" android:layout_marginRight="10dp" android:layout_weight="1" android:drawablePadding="5dp" android:drawableTop="@drawable/abr" android:gravity="center" android:text="购物车" android:textColor="#6b6868" android:textSize="15sp" /> <Button android:id="@+id/add_Buy" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:layout_weight="1.5" android:background="@drawable/buy" android:gravity="center" android:paddingLeft="25dp" android:paddingRight="25dp" android:text="加入购物车" android:textColor="#ffff00" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> </LinearLayout>
item_my
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/item_img" android:layout_width="150dp" android:layout_height="150dp" android:layout_margin="8dp" fresco:failureImage="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" android:id="@+id/title"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" android:id="@+id/price"/> </LinearLayout> </LinearLayout>
colors
<resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="View_BG">#e6e0e0</color> //加入购物车选中 <color name="add_buy">#e7633f</color> <color name="colorRed">#ff0000</color> </resources>
buy
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/add_buy" android:state_pressed="true" /> <item android:drawable="@color/colorRed" /> </selector>
guanzhu_ck
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ali" android:state_checked="true" /> <item android:drawable="@drawable/alh" /> </selector>
a96 abr alh ali at2 checked