/--------依赖------------/
//Recycleview依赖 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.jcodecraeer:xrecyclerview:1.3.2' //GSON依赖 compile 'com.google.code.gson:gson:2.2.4' //butterknife(黄油刀) compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' //SimpleDraweeView加载图片的依赖: compile 'com.facebook.fresco:fresco:1.5.0' //rxjava compile 'io.reactivex:rxjava:1.1.6' compile 'io.reactivex:rxandroid:1.2.1' //retrofit2 compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0' //glide依赖包 compile 'com.github.bumptech.glide:glide:3.7.0'/----------权限---------------/
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
工具包
public class HttpConfig { //https://www.zhaoapi.cn/product/getProducts //当前子分类下的商品列表(分页) public static String base_url="http://120.27.23.105/"; }
接口Service
public interface MyService { //登录 @FormUrlEncoded @POST("user/login") Observable<LoginUserBean> loginpost(@FieldMap Map<String,String> map); //注册 @FormUrlEncoded @POST("user/reg") Observable<RegBean> regpost(@FieldMap Map<String,String> map); //获取商品列表 @GET("product/getProducts") Observable<GoodsBean> getGoodsListData(@Query("pscid") String pscid,@Query("page") String page); //添加购物车 //添加购物车 @GET("product/addCart") Observable<AddBean> addCart(@Query("uid") String uid, @Query("pid") String pid); }
网络请求工具包
public class RetrofitUtils { //单利模式 private static RetrofitUtils retrofitUtils; private final Retrofit retrofit; public static RetrofitUtils getRetrofitUtils(){ //判断 if(retrofitUtils==null){ retrofitUtils=new RetrofitUtils(); } return retrofitUtils; } public RetrofitUtils(){ retrofit=new Retrofit.Builder() .baseUrl(HttpConfig.base_url) .addConverterFactory(GsonConverterFactory.create(new Gson())) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } public <T> T createRequest(Class<T> clz){ T t = retrofit.create(clz); return t; } }
M层
public interface IModel { //登录 void login(Map<String,String> map); //注册 void reg(Map<String,String> map); //获取商品列表 void getGoodsListData(String pscid,String page); void getGoodsListFresh(String pscid,String page); void getGoodsListLoadMore(String pscid,String page); //添加购物车 void addCart(String uid, String pid); //购物车 }
P层 接口
public interface IPresenter { //登录 void loginPresenter(IModel iModel, IView iView); //接收参数 void getLogin(LoginUserBean loginUserBean); //接收失败的提示 void getErrorData(String msg); //注册 void regPresenter(IModel iModel, IRegView iRegView); //接收参数 void getReg(RegBean regBean); //接收失败的提示 void getRegErrorData(String msg); //--------------商品列表---------------- //得到商品列表数据 //关联M和V层 void getGoodsList(IModel iModel,IGoodsView iGoodsView); void getGoodsListFresh(IModel iModel,IGoodsView iGoodsView); void getGoodsListLoadMore(IModel iModel,IGoodsView iGoodsView); //展示列表数据 void getGoodsListData(List<GoodsBean.DataBean> list); void getGoodsListFresh(List<GoodsBean.DataBean> list); void getGoodsListLoadMore(List<GoodsBean.DataBean> list); //错误提示 void getGoodsListError(String error); //-----------添加购物车 void addCart(IModel iModel, IDetailView iDetailView); void addSuccess(); void addError(); }
V层 接口
public interface IView { //登录成功 void loginSuccess(); //登录失败 void loginError(String error); //获取手机号 String getMobile(); //获取密码 String getPassword(); }实体类
public class ModelImp1 implements IModel{ private static final String TAG = "ModelImp1---"; //关联p层 private IPresenter iPresenter; public ModelImp1(IPresenter iPresenter) { this.iPresenter = iPresenter; } //登录 @Override public void login(Map<String, String> map) { //使用retrofit RetrofitUtils retrofitUtils = RetrofitUtils.getRetrofitUtils(); MyService myService = retrofitUtils.createRequest(MyService.class); myService.loginpost(map) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginUserBean>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: 完成-----"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError: 异常-----"+e.getMessage()); //调用p层的错误提示方法 iPresenter.getErrorData(e.getMessage()); } @Override public void onNext(LoginUserBean loginUserBean) { //把值传给p层 Log.d(TAG, "onNext: "+loginUserBean); //判断 if(loginUserBean.getCode().equals("0")){ iPresenter.getLogin(loginUserBean); }else{ iPresenter.getErrorData("请先注册---"); } } }); } //注册 @Override public void reg(Map<String, String> map) { RetrofitUtils retrofitUtils = RetrofitUtils.getRetrofitUtils(); MyService myService = retrofitUtils.createRequest(MyService.class); myService.regpost(map) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<RegBean>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: 注册完成----"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError: 异常---"+e.getMessage()); iPresenter.getRegErrorData("注册失败--"); } @Override public void onNext(RegBean regBean) { Log.d(TAG, "onNext: "+regBean); //判断 if(regBean.getCode().equals("0")){ iPresenter.getReg(regBean); }else{ iPresenter.getRegErrorData("注册失败"); } } }); } //----------------商品列表页面------------------ @Override public void getGoodsListData(String pscid, String page) { //retrofit网络请求 RetrofitUtils retrofitUtils = RetrofitUtils.getRetrofitUtils(); MyService myService = retrofitUtils.createRequest(MyService.class); myService.getGoodsListData(pscid, page) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GoodsBean>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: 商品列表完成----"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError: 异常------"+e); } @Override public void onNext(GoodsBean goodsBean) { String code = goodsBean.getCode(); Log.d("test",code + "==============="); if(code.equals("0")){ iPresenter.getGoodsListData(goodsBean.getData()); }else{ Log.d(TAG, "onNext: "+goodsBean); } } }); } @Override public void getGoodsListFresh(String pscid, String page) { //retrofit网络请求 RetrofitUtils retrofitUtils = RetrofitUtils.getRetrofitUtils(); MyService myService = retrofitUtils.createRequest(MyService.class); myService.getGoodsListData(pscid, page) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GoodsBean>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: 商品列表完成----"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError: 异常------"+e); } @Override public void onNext(GoodsBean goodsBean) { String code = goodsBean.getCode(); if(code.equals("0")){ iPresenter.getGoodsListData(goodsBean.getData()); }else{ Log.d(TAG, "onNext: "+goodsBean); } } }); } @Override public void getGoodsListLoadMore(String pscid, String page) { //retrofit网络请求 RetrofitUtils retrofitUtils = RetrofitUtils.getRetrofitUtils(); MyService myService = retrofitUtils.createRequest(MyService.class); myService.getGoodsListData(pscid, page) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GoodsBean>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted: 商品列表完成----"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError: 异常------"+e); } @Override public void onNext(GoodsBean goodsBean) { String code = goodsBean.getCode(); if(code.equals("0")){ iPresenter.getGoodsListData(goodsBean.getData()); }else{ Log.d(TAG, "onNext: "+goodsBean); } } }); } //添加购物车 @Override public void addCart(String uid, String pid) { RetrofitUtils retrofitUtils = RetrofitUtils.getRetrofitUtils(); MyService myService = retrofitUtils.createRequest(MyService.class); myService.addCart(uid,pid) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<AddBean>() { @Override public void onCompleted() { Log.d(TAG, "tainjai--- "); } @Override public void onError(Throwable e) { Log.d(TAG, "tainjai失败---: "); iPresenter.addError(); } @Override public void onNext(AddBean addBean) { Log.d(TAG, "addBean: "+addBean); if (addBean.getCode().equals("0")){ iPresenter.addSuccess(); }else { iPresenter.addError(); } } }); } }P 实体类
public class PresenterImp1 implements IPresenter{ //关联V层 private IView iView; private IRegView iRegView; private IGoodsView iGoodsView; private IDetailView iDetailView; private static final String TAG = "PresenterImp1==="; @Override public void loginPresenter(IModel iModel, IView iView) { this.iView=iView; //创建Map集合 Map<String,String> map=new HashMap<>(); map.put("mobile",iView.getMobile()); map.put("password",iView.getPassword()); //调用M层登录的方法 iModel.login(map); } @Override public void getLogin(LoginUserBean loginUserBean) { iView.loginSuccess(); } @Override public void getErrorData(String msg) { iView.loginError(msg); } //----------------注册---------------------- @Override public void regPresenter(IModel iModel, IRegView iRegView) { this.iRegView=iRegView; Map<String,String> map=new HashMap<>(); map.put("mobile",iRegView.getMobile()); map.put("password",iRegView.getPassword()); iModel.reg(map); } @Override public void getReg(RegBean regBean) { iRegView.regSuccess(); } @Override public void getRegErrorData(String msg) { iRegView.regError(msg); } //---------------商品列表---------------- @Override public void getGoodsList(IModel iModel, IGoodsView iGoodsView) { this.iGoodsView=iGoodsView; //调用M层展示数据的方法 iModel.getGoodsListData("1","1"); } //刷新 @Override public void getGoodsListFresh(IModel iModel, IGoodsView iGoodsView) { this.iGoodsView=iGoodsView; iModel.getGoodsListFresh("1",iGoodsView.getPage()); } //加载 @Override public void getGoodsListLoadMore(IModel iModel, IGoodsView iGoodsView) { this.iGoodsView=iGoodsView; iModel.getGoodsListLoadMore("1",iGoodsView.getPage()); } @Override public void getGoodsListData(List<GoodsBean.DataBean> list) { iGoodsView.showGoodsList(list); } //获取刷新数据 @Override public void getGoodsListFresh(List<GoodsBean.DataBean> list) { iGoodsView.showGoodsListFresh(list); } //获取加载的数据 @Override public void getGoodsListLoadMore(List<GoodsBean.DataBean> list) { iGoodsView.showGoodsListLoadMore(list); } @Override public void getGoodsListError(String error) { Log.d(TAG, "getGoodsListError: "+error); } //添加购物车 @Override public void addCart(IModel iModel, IDetailView iDetailView) { this.iDetailView = iDetailView; iModel.addCart(iDetailView.getUid(),iDetailView.getPid()); } @Override public void addSuccess() { iDetailView.addSuccess(); } @Override public void addError() { iDetailView.addError(); } }
V 实体类 MainActivity
package view; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import bawei.com.yuekao2_moni.R; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import model.ModelImp1; import presenter.PresenterImp1; public class MainActivity extends AppCompatActivity implements IView { @BindView(R.id.mobile) EditText mobile; @BindView(R.id.password) EditText password; @BindView(R.id.login) Button login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } //登录成功 @Override public void loginSuccess() { Toast.makeText(MainActivity.this,"登录成功----",Toast.LENGTH_SHORT).show(); //跳转到商品列表页面 Intent intent=new Intent(MainActivity.this,GoodsActivity.class); startActivity(intent); finish(); } //登录失败 @Override public void loginError(String error) { Toast.makeText(MainActivity.this,"登录失败--"+error,Toast.LENGTH_SHORT).show(); //跳转到注册页面 Intent intent=new Intent(MainActivity.this,ResActivity.class); startActivity(intent); } //获取用户名 @Override public String getMobile() { return mobile.getText().toString(); } //获取密码 @Override public String getPassword() { return password.getText().toString(); } @OnClick(R.id.login) public void onViewClicked() { //调用p层的登录 PresenterImp1 presenterImp1=new PresenterImp1(); presenterImp1.loginPresenter(new ModelImp1(presenterImp1),MainActivity.this); } }
注册接口 实体类
package view; public interface IRegView { //注册成功 void regSuccess(); //注册失败 void regError(String error); //获取手机号 String getMobile(); //获取密码 String getPassword(); }
ResActivity注册页面
package view; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import bawei.com.yuekao2_moni.R; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import model.ModelImp1; import presenter.PresenterImp1; public class ResActivity extends AppCompatActivity implements IRegView { @BindView(R.id.mobile) EditText mobile; @BindView(R.id.password) EditText password; @BindView(R.id.password2) EditText password2; @BindView(R.id.email) EditText email; @BindView(R.id.resgister) Button resgister; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_res); ButterKnife.bind(this); } @OnClick(R.id.resgister) public void onViewClicked() { //调用p层里的注册 PresenterImp1 presenterImp1=new PresenterImp1(); presenterImp1.regPresenter(new ModelImp1(presenterImp1),ResActivity.this); } @Override public void regSuccess() { Toast.makeText(ResActivity.this,"注册成功--------",Toast.LENGTH_SHORT).show(); //跳转到商品列表页面 Intent intent=new Intent(ResActivity.this,GoodsActivity.class); startActivity(intent); } @Override public void regError(String error) { //吐司注册有误 Toast.makeText(ResActivity.this,"注册错误---"+error,Toast.LENGTH_SHORT).show(); } @Override public String getMobile() { return mobile.getText().toString(); } @Override public String getPassword() { return password.getText().toString(); } }
商品列表 接口 IGoodsView
package view; import java.util.List; import bean.GoodsBean; public interface IGoodsView { //显示商品 void showGoodsList(List<GoodsBean.DataBean> list); void showGoodsListFresh(List<GoodsBean.DataBean> list); void showGoodsListLoadMore(List<GoodsBean.DataBean> list); String getPage();//获取页数 }
商品列表页面
package view; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.Toast; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.ArrayList; import java.util.List; import bawei.com.yuekao2_moni.R; import bean.GoodsBean; import butterknife.BindView; import butterknife.ButterKnife; import model.ModelImp1; import presenter.PresenterImp1; public class GoodsActivity extends AppCompatActivity implements IGoodsView { @BindView(R.id.goods_xrecycler) XRecyclerView goodsXrecyler; private long firstTime = 0; private static final String TAG = "GoodsActivity-----"; private PresenterImp1 presenter; int page = 1; List<GoodsBean.DataBean> list = new ArrayList<>(); private MyGoodsListAdapter myGoodsListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_goods); ButterKnife.bind(this); //初始化界面 initViews(); //调用p请求数据 presenter = new PresenterImp1(); presenter.getGoodsList(new ModelImp1(presenter), this); } private void initViews() { goodsXrecyler.setLayoutManager(new LinearLayoutManager(this)); goodsXrecyler.setLoadingMoreEnabled(true); goodsXrecyler.setPullRefreshEnabled(true); goodsXrecyler.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { page = 1; presenter.getGoodsListFresh(new ModelImp1(presenter), GoodsActivity.this); } @Override public void onLoadMore() { page++; presenter.getGoodsListLoadMore(new ModelImp1(presenter), GoodsActivity.this); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if (System.currentTimeMillis() - firstTime > 2000) { Toast.makeText(GoodsActivity.this, "再按一次退出程序--->onKeyDown", Toast.LENGTH_SHORT).show(); firstTime = System.currentTimeMillis(); } else { finish(); System.exit(0); } return true; } return super.onKeyDown(keyCode, event); } //显示商品 @Override public void showGoodsList(List<GoodsBean.DataBean> list) { this.list = list; Log.d(TAG, "showGoodsList: " + list.size()); myGoodsListAdapter = new MyGoodsListAdapter(GoodsActivity.this, list); goodsXrecyler.setAdapter(myGoodsListAdapter); myGoodsListAdapter.setOnMyItemClick(new MyGoodsListAdapter.MyItemClick() { @Override public void onMyItemClick(View view, int postion, int pscid) { GoodsBean.DataBean dataBean = GoodsActivity.this.list.get(postion); Intent intent = new Intent(GoodsActivity.this, DetailActivity.class); intent.putExtra("goodsbean", dataBean); startActivity(intent); } }); } //刷新 @Override public void showGoodsListFresh(List<GoodsBean.DataBean> list) { this.list = list; Log.d(TAG, "showGoodsListFresh: " + list); myGoodsListAdapter = new MyGoodsListAdapter(GoodsActivity.this, list); goodsXrecyler.setAdapter(myGoodsListAdapter); goodsXrecyler.refreshComplete(); } //更多 @Override public void showGoodsListLoadMore(List<GoodsBean.DataBean> list) { Log.d(TAG, "showGoodsListLoadMore: " + list); this.list.addAll(list); myGoodsListAdapter.notifyDataSetChanged(); goodsXrecyler.loadMoreComplete(); } @Override public String getPage() { return page + ""; } }
商品列表适配器
package view; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; import bawei.com.yuekao2_moni.R; import bean.GoodsBean; public class MyGoodsListAdapter extends RecyclerView.Adapter<MyGoodsListAdapter.MyViewHolder> { private final Context context; private final List<GoodsBean.DataBean> list; private MyItemClick myItemClick; public MyGoodsListAdapter(Context context, List<GoodsBean.DataBean> list) { this.context = context; this.list = list; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.goods_item_layout, null); MyViewHolder myViewHolder = new MyViewHolder(view); return myViewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { String picurl = list.get(position).getImages().split("\\|")[0]; holder.getSimpleDraweeView().setImageURI(picurl); holder.getTextView().setText(list.get(position).getTitle()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myItemClick.onMyItemClick(v, position,list.get(position).getPscid()); } }); } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private SimpleDraweeView simpleDraweeView; private TextView textView; public MyViewHolder(View itemView) { super(itemView); simpleDraweeView = itemView.findViewById(R.id.goods_pic); textView = itemView.findViewById(R.id.goods_title); } public SimpleDraweeView getSimpleDraweeView() { return simpleDraweeView; } public void setSimpleDraweeView(SimpleDraweeView simpleDraweeView) { this.simpleDraweeView = simpleDraweeView; } public TextView getTextView() { return textView; } public void setTextView(TextView textView) { this.textView = textView; } } public interface MyItemClick { void onMyItemClick(View view, int postion, int pscid); } public void setOnMyItemClick(MyItemClick myItemClick) { this.myItemClick = myItemClick; } 商品详情接口 IDetailView
package view; public interface IDetailView { String getUid(); String getPid(); void addSuccess(); void addError(); }详情主页
package view; import android.content.Intent; import android.graphics.Paint; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.facebook.drawee.view.SimpleDraweeView; import bawei.com.yuekao2_moni.R; import bean.GoodsBean; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import model.ModelImp1; import presenter.PresenterImp1; public class DetailActivity extends AppCompatActivity implements IDetailView { @BindView(R.id.detail_pic) SimpleDraweeView detailPic; @BindView(R.id.detail_title) TextView detailTitle; @BindView(R.id.detail_price) TextView detailPrice; @BindView(R.id.detail_jump) TextView detailJump; @BindView(R.id.detail_add) TextView detailAdd; private GoodsBean.DataBean dataBean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); ButterKnife.bind(this); //获取数据 getDatas(); } private void getDatas() { Intent intent = getIntent(); dataBean = (GoodsBean.DataBean) intent.getSerializableExtra("goodsbean"); String s = dataBean.getImages().split("\\|")[0]; detailPic.setImageURI(s); detailTitle.setText(dataBean.getTitle()); detailPrice.setText(dataBean.getBargainPrice() + ""); detailPrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG); } @Override public String getUid() { return "71"; } @Override public String getPid() { return dataBean.getPid() + ""; } //添加成功 @Override public void addSuccess() { Toast.makeText(DetailActivity.this, "成功--", Toast.LENGTH_SHORT).show(); } @Override public void addError() { Toast.makeText(DetailActivity.this, "失败--", Toast.LENGTH_SHORT).show(); } @OnClick({R.id.detail_jump, R.id.detail_add}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.detail_jump: startActivity(new Intent(DetailActivity.this, CartActivity.class)); break; case R.id.detail_add: //添加 PresenterImp1 presenter = new PresenterImp1(); presenter.addCart(new ModelImp1(presenter), this); break; } } }
以下就是需要的bean类数据
//登录数据
package bean; public class LoginUserBean { /** * msg : 登录成功 * code : 0 * data : {"age":null,"appkey":"2b402f5d8b5bc36f","appsecret":"522983C699C5C9368C839BBD69C5A69D","createtime":"2018-04-04T14:30:07","email":null,"fans":null,"follow":null,"gender":null,"icon":null,"latitude":null,"longitude":null,"mobile":"15701574650","money":null,"nickname":null,"password":"8F669074CAF5513351A2DE5CC22AC04C","praiseNum":null,"token":"E38FA65D6C2F09B0B1EAD58CB7BE04CF","uid":10259,"userId":null,"username":"15701574650"} */ private String msg; private String code; private 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 DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public static class DataBean { /** * age : null * appkey : 2b402f5d8b5bc36f * appsecret : 522983C699C5C9368C839BBD69C5A69D * createtime : 2018-04-04T14:30:07 * email : null * fans : null * follow : null * gender : null * icon : null * latitude : null * longitude : null * mobile : 15701574650 * money : null * nickname : null * password : 8F669074CAF5513351A2DE5CC22AC04C * praiseNum : null * token : E38FA65D6C2F09B0B1EAD58CB7BE04CF * uid : 10259 * userId : null * username : 15701574650 */ private Object age; private String appkey; private String appsecret; private String createtime; private Object email; private Object fans; private Object follow; private Object gender; private Object icon; private Object latitude; private Object longitude; private String mobile; private Object money; private Object nickname; private String password; private Object praiseNum; private String token; private int uid; private Object userId; private String username; public Object getAge() { return age; } public void setAge(Object age) { this.age = age; } public String getAppkey() { return appkey; } public void setAppkey(String appkey) { this.appkey = appkey; } public String getAppsecret() { return appsecret; } public void setAppsecret(String appsecret) { this.appsecret = appsecret; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public Object getEmail() { return email; } public void setEmail(Object email) { this.email = email; } public Object getFans() { return fans; } public void setFans(Object fans) { this.fans = fans; } public Object getFollow() { return follow; } public void setFollow(Object follow) { this.follow = follow; } public Object getGender() { return gender; } public void setGender(Object gender) { this.gender = gender; } public Object getIcon() { return icon; } public void setIcon(Object icon) { this.icon = icon; } public Object getLatitude() { return latitude; } public void setLatitude(Object latitude) { this.latitude = latitude; } public Object getLongitude() { return longitude; } public void setLongitude(Object longitude) { this.longitude = longitude; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public Object getMoney() { return money; } public void setMoney(Object money) { this.money = money; } public Object getNickname() { return nickname; } public void setNickname(Object nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Object getPraiseNum() { return praiseNum; } public void setPraiseNum(Object praiseNum) { this.praiseNum = praiseNum; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public Object getUserId() { return userId; } public void setUserId(Object userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } }
//获取用户名和密码的bean类
package bean; public class User { private String mobile; private String password; public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "mobile='" + mobile + '\'' + ", password='" + password + '\'' + '}'; } }
//注册数据
package bean; public class RegBean { /** * msg : 注册成功 * code : 0 */ private String msg; private String code; 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; } }
//商品数据
package bean; import java.io.Serializable; import java.util.List; public class GoodsBean { /** * msg : 请求成功 * code : 0 * data : [{"bargainPrice":99,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/4345173.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t6037/35/2944615848/95178/6cd6cff0/594a3a10Na4ec7f39.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6607/258/1025744923/75738/da120a2d/594a3a12Ne3e6bc56.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6370/292/1057025420/64655/f87644e3/594a3a12N5b900606.jpg!q70.jpg","itemtype":1,"pid":45,"price":2999,"pscid":39,"salenum":4666,"sellerid":1,"subhead":"高清双摄,就是清晰!2000+1600万高清摄像头,6GB大内存+高通骁龙835处理器,性能怪兽!","title":"一加手机5 (A5000) 6GB+64GB 月岩灰 全网通 双卡双待 移动联通电信4G手机"},{"bargainPrice":6666,"createtime":"2017-10-10T16:01:31","detailUrl":"https://item.m.jd.com/product/5089273.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8284/363/1326459580/71585/6d3e8013/59b857f2N6ca75622.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9346/182/1406837243/282106/68af5b54/59b8480aNe8af7f5c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8434/54/1359766007/56140/579509d9/59b85801Nfea207db.jpg!q70.jpg","itemtype":0,"pid":46,"price":234,"pscid":39,"salenum":868,"sellerid":2,"subhead":"【iPhone新品上市】新一代iPhone,让智能看起来更不一样","title":"Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机"},{"bargainPrice":1599,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/1993026402.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5863/302/8961270302/97126/41feade1/5981c81cNc1b1fbef.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t7003/250/1488538438/195825/53bf31ba/5981c57eN51e95176.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5665/100/8954482513/43454/418611a9/5981c57eNd5fc97ba.jpg!q70.jpg","itemtype":2,"pid":47,"price":111,"pscid":39,"salenum":757,"sellerid":3,"subhead":"碳黑色 32GB 全网通 官方标配 1件","title":"锤子 坚果Pro 特别版 巧克力色 酒红色 全网通 移动联通电信4G手机 双卡双待 碳黑色 32GB 全网通"},{"bargainPrice":3455,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":1,"pid":48,"price":222,"pscid":39,"salenum":656,"sellerid":4,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":1999,"createtime":"2017-10-10T16:09:02","detailUrl":"https://item.m.jd.com/product/5025971.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t7210/232/3738666823/232298/9004583e/59c3a9a7N8de42e15.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8356/82/2107423621/109733/c019b8c6/59c3a9a6Ne9a4bdd7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t10219/74/25356012/171379/7d55e296/59c3a9a8N82fa6e02.jpg!q70.jpg","itemtype":0,"pid":49,"price":333,"pscid":39,"salenum":123,"sellerid":5,"subhead":"vivo X20 带你开启全面屏时代!逆光也清晰,照亮你的美!","title":"vivo X20 全面屏手机 全网通 4GB+64GB 金色 移动联通电信4G手机 双卡双待"},{"bargainPrice":3455,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":2,"pid":50,"price":444,"pscid":39,"salenum":54,"sellerid":6,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":3455,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":1,"pid":51,"price":555,"pscid":39,"salenum":424,"sellerid":7,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":3455,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":0,"pid":52,"price":666,"pscid":39,"salenum":212,"sellerid":8,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"},{"bargainPrice":2999,"createtime":"2017-10-14T21:48:08","detailUrl":"https://item.m.jd.com/product/2385655.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t2068/298/2448145915/157953/7be197df/56d51a42Nd86f1c8e.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2437/128/1687178395/117431/bcc190c1/56d3fcbaNb2963d21.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t2467/222/2263160610/95597/927b8a2f/56d3eafeNdecebeb6.jpg!q70.jpg","itemtype":2,"pid":53,"price":777,"pscid":39,"salenum":0,"sellerid":9,"subhead":"Super AMOLED三星双曲面2K 屏,支持无线充电!","title":"三星 Galaxy S7 edge(G9350)4GB+32GB 铂光金 移动联通电信4G手机 双卡双待"},{"bargainPrice":3455,"createtime":"2017-10-03T23:53:28","detailUrl":"https://item.m.jd.com/product/12224420750.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t9106/106/1785172479/537280/253bc0ab/59bf78a7N057e5ff7.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8461/5/1492479653/68388/7255e013/59ba5e84N91091843.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t8803/356/1478945529/489755/2a163ace/59ba5e84N7bb9a666.jpg!q70.jpg","itemtype":0,"pid":54,"price":888,"pscid":39,"salenum":7575,"sellerid":10,"subhead":"【现货新品抢购】全面屏2.0震撼来袭,骁龙835处理器,四曲面陶瓷机","title":"小米(MI) 小米MIX2 手机 黑色 全网通 (6GB+64GB)【标配版】"}] * page : 1 */ private String msg; private String code; private String page; 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 String getPage() { return page; } public void setPage(String page) { this.page = page; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean implements Serializable{ /** * bargainPrice : 99 * createtime : 2017-10-14T21:38:26 * detailUrl : https://item.m.jd.com/product/4345173.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends * images : https://m.360buyimg.com/n0/jfs/t6037/35/2944615848/95178/6cd6cff0/594a3a10Na4ec7f39.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6607/258/1025744923/75738/da120a2d/594a3a12Ne3e6bc56.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t6370/292/1057025420/64655/f87644e3/594a3a12N5b900606.jpg!q70.jpg * itemtype : 1 * pid : 45 * price : 2999 * pscid : 39 * salenum : 4666 * sellerid : 1 * subhead : 高清双摄,就是清晰!2000+1600万高清摄像头,6GB大内存+高通骁龙835处理器,性能怪兽! * title : 一加手机5 (A5000) 6GB+64GB 月岩灰 全网通 双卡双待 移动联通电信4G手机 */ 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; } } }
//添加的数据
package bean; public class AddBean { /** * msg : 加购成功 * code : 0 */ private String msg; private String code; 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; } }
以下就是布局了--------------
------------登录布局-----------
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="view.MainActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登录页面" android:gravity="center" /> <EditText android:id="@+id/mobile" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入手机号" android:layout_marginTop="20sp" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:hint="请输入密码" /> <Button android:id="@+id/login" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:text="登录" /> </LinearLayout>
-------------注册页面---------------------
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="view.ResActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注册页面" android:gravity="center" /> <EditText android:id="@+id/mobile" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入手机号" android:layout_marginTop="20sp" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:hint="请输入密码" /> <EditText android:id="@+id/password2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:hint="请确认密码" /> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:hint="请输入邮箱" /> <Button android:id="@+id/resgister" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:text="注册" /> </LinearLayout>--------------商品布局----------------------
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_goods" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="view.GoodsActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/goods_xrecycler" android:layout_width="wrap_content" android:layout_height="wrap_content"> </com.jcodecraeer.xrecyclerview.XRecyclerView> </LinearLayout>//展示的条目布局 goods_item_layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <com.facebook.drawee.view.SimpleDraweeView android:layout_width="70dp" android:layout_height="70dp" android:id="@+id/goods_pic" /> <TextView android:id="@+id/goods_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="标题" android:textSize="24sp" android:textColor="#000" /> </LinearLayout>--------详情的布局--------------
<?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="view.DetailActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/detail_pic" android:layout_width="match_parent" android:layout_height="200dp" /> <TextView android:id="@+id/detail_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="标题" android:textSize="30sp" /> <TextView android:id="@+id/detail_price" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="价格" android:textColor="@android:color/holo_red_light" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/detail_jump" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="购物车" android:textSize="25sp" /> <TextView android:id="@+id/detail_add" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="添加购物车" android:textSize="25sp" /> </LinearLayout> </LinearLayout>
这篇博客主要介绍了如何在移动应用中实现登录注册功能以及商品列表和商品详情的展示。涵盖了从依赖到各个层(接口Service、M层、P层、V层)的详细说明,包括接口定义、实体类、活动页面(如MainActivity、ResActivity注册页面)以及商品列表接口(IGoodsView)和页面、适配器的实现。此外,提到了登录数据、注册数据、商品数据的处理以及相关Bean类的设计。
482

被折叠的 条评论
为什么被折叠?



