使用MVP+Retrofit+RXJava实现仿京东分类
加依赖 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.jakewharton:butterknife:7.0.1' compile 'org.greenrobot:eventbus:3.0.0' testCompile 'junit:junit:4.12' 千万记得把bean类里的price改成double类型
public class Api { // 分类 // http://120.27.23.105/product/getCatagory public static final String HOST = "http://120.27.23.105/"; }
public interface ApiService { @GET("product/getCatagory") Observable<FenleiLeftBean> getdatas(); //http://120.27.23.105/product/getProductCatagory @GET("product/getProductCatagory") Observable<FenleiRightBean> getRightData(@Query("cid") int cid);
@POST Observable<FenleiLiebiaoBean> getliebiaoData(@Url String url, @QueryMap Map<String,Integer> map);
}
public class App extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
public interface FenleiLeftIView { void showList(List<FenleiLeftBean.DataBean> list); void showError(String e); }
public interface FenleiLeftIModel { void RequestData(String url,OnRequestListener onRequestListener); }
public class FenleiLeftModel implements FenleiLeftIModel { @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); Observable<FenleiLeftBean> getdatas = apiService.getdatas(); getdatas.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<FenleiLeftBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onRequestListener.OnError(e.getMessage().toString()); } @Override public void onNext(FenleiLeftBean fenleiLeftBean) { List<FenleiLeftBean.DataBean> data = fenleiLeftBean.data; onRequestListener.OnSuccess(data); } }); } }
public interface OnRequestListener { void OnSuccess(List<FenleiLeftBean.DataBean> list); void OnRightSuccess(List<FenleiRightBean.DataBean> list); void OnError(String e); }
public interface FenleileftIPresenter { void loadList(String url); }
public class FenleiLeftPresenter implements FenleileftIPresenter{ private FenleiLeftIView fenleiLeftIView; private FenleiLeftIModel fenleiLeftIModel; public FenleiLeftPresenter(FenleiLeftIView fenleiLeftIView) { this.fenleiLeftIView = fenleiLeftIView; fenleiLeftIModel = new FenleiLeftModel(); } @Override public void loadList(String url) { fenleiLeftIModel.RequestData(url, new OnRequestListener() { @Override public void OnSuccess(List<FenleiLeftBean.DataBean> list) { fenleiLeftIView.showList(list); } @Override public void OnRightSuccess(List<FenleiRightBean.DataBean> list) { } @Override public void OnError(String e) { fenleiLeftIView.showError(e); } }); } }
public class FenleiFragment extends Fragment implements FenleiLeftIView,FenleiRightIView{ @Bind(R.id.fenleileftrecler) RecyclerView fenleileftrecler; @Bind(R.id.fenleirightrecler) RecyclerView fenleirightrecler; private int id; private FenleileftAdapter fenleileftAdapter; private FenleiRightPresenter fenleiRightPresenter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_fenlei, null); ButterKnife.bind(this, view); LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getContext()); fenleileftrecler.setLayoutManager(linearLayoutManager); LinearLayoutManager linearLayoutManagerright=new LinearLayoutManager(getContext()); fenleirightrecler.setLayoutManager(linearLayoutManagerright); FenleiLeftPresenter fenleiLeftPresenter = new FenleiLeftPresenter(this); fenleiLeftPresenter.loadList(Api.HOST); fenleiRightPresenter = new FenleiRightPresenter(this); fenleiRightPresenter.loadRightList(Api.HOST,1); return view; } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } @Override public void showList(final List<FenleiLeftBean.DataBean> list) { fenleileftAdapter = new FenleileftAdapter(getContext(), list); fenleileftrecler.setAdapter(fenleileftAdapter); fenleileftAdapter.setOnClickListener(new FenleileftAdapter.OnClickListener() { @Override public void OnDianji(View v, int position) { int cid = list.get(position).cid; fenleiRightPresenter.loadRightList(Api.HOST,cid); } }); } @Override public void showRight(List<FenleiRightBean.DataBean> list) { FenleiRightAdapter fenleiRightAdapter = new FenleiRightAdapter(getContext(), list); fenleirightrecler.setAdapter(fenleiRightAdapter); } @Override public void showError(String e) { } }
public class FenleileftAdapter extends RecyclerView.Adapter<FenleileftAdapter.ViewHolder> { private Context context; private List<FenleiLeftBean.DataBean> list; private OnClickListener onClickListener; public FenleileftAdapter(Context context, List<FenleiLeftBean.DataBean> list) { this.context = context; this.list = list; } public OnClickListener getOnClickListener(){ return onClickListener; } public void setOnClickListener(OnClickListener onClickListener){ this.onClickListener=onClickListener; } public interface OnClickListener{ void OnDianji(View v,int position); } @Override public FenleileftAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.fenlei_left_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(FenleileftAdapter.ViewHolder holder, final int position) { holder.left_name.setText(list.get(position).name); holder.left_img.setImageURI(list.get(position).icon); // EventBus.getDefault().postSticky(new FenleiEvent(list.get(position).cid)); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // EventBus.getDefault().postSticky(new FenleiEvent(list.get(position).cid)); onClickListener.OnDianji(view, position); } }); } @Override public int getItemCount() { return list.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public TextView left_name; public SimpleDraweeView left_img; public ViewHolder(View itemView) { super(itemView); left_name=itemView.findViewById(R.id.left_name); left_img=itemView.findViewById(R.id.left_img); } } }
public interface FenleiRightIView { void showRight(List<FenleiRightBean.DataBean> list); // void showError(String e); }
public interface FenleiRightIModel { void RequestRightData(String url,int cid,OnRequestListener onRequestListener); }
public class FenleiRightModel implements FenleiRightIModel { @Override public void RequestRightData(String url, int cid, final OnRequestListener onRequestListener) { //retrofit网络请求 Retrofit retrofit = new Retrofit .Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); Observable<FenleiRightBean> rightData = apiService.getRightData(cid); rightData.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<FenleiRightBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onRequestListener.OnError(e.getMessage().toString()); } @Override public void onNext(FenleiRightBean fenleiRightBean) { List<FenleiRightBean.DataBean> data = fenleiRightBean.data; onRequestListener.OnRightSuccess(data); } }); } }
public interface FenleiRightIPresenter { void loadRightList(String url,int cid); }
public class FenleiRightPresenter implements FenleiRightIPresenter { private FenleiRightIView fenleiRightIView; private FenleiRightIModel fenleiRightIModel; public FenleiRightPresenter(FenleiRightIView fenleiRightIView) { this.fenleiRightIView = fenleiRightIView; fenleiRightIModel = new FenleiRightModel(); } @Override public void loadRightList(String url, int cid) { fenleiRightIModel.RequestRightData(url, cid, new OnRequestListener() { @Override public void OnSuccess(List<FenleiLeftBean.DataBean> list) { } @Override public void OnRightSuccess(List<FenleiRightBean.DataBean> list) { fenleiRightIView.showRight(list); } @Override public void OnError(String e) { } }); } }
public class FenleiRightAdapter extends RecyclerView.Adapter<FenleiRightAdapter.ViewHolder> { private Context context; private List<FenleiRightBean.DataBean> rightlist; public FenleiRightAdapter(Context context, List<FenleiRightBean.DataBean> rightlist) { this.context = context; this.rightlist = rightlist; } @Override public FenleiRightAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.fenlei_right_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(FenleiRightAdapter.ViewHolder holder, int position) { // holder.right_name.setText(rightlist.get(position).list.get(0).name); holder.right_name.setText(rightlist.get(position).name); GridLayoutManager gridLayoutManager=new GridLayoutManager(context,3); holder.childrecycler.setLayoutManager(gridLayoutManager); FenleiChildAdapter fenleiChildAdapter = new FenleiChildAdapter(context, rightlist.get(position).list); holder.childrecycler.setAdapter(fenleiChildAdapter); } @Override public int getItemCount() { return rightlist.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public TextView right_name; public RecyclerView childrecycler; public ViewHolder(View itemView) { super(itemView); right_name=itemView.findViewById(R.id.right_name); childrecycler=itemView.findViewById(R.id.childrecycler); } } }
public class FenleiChildAdapter extends RecyclerView.Adapter<FenleiChildAdapter.ViewHolder> { private Context context; private List<FenleiRightBean.DataBean.ListBean> listBean; public FenleiChildAdapter(Context context, List<FenleiRightBean.DataBean.ListBean> listBean) { this.context = context; this.listBean = listBean; } @Override public FenleiChildAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.fenlei_right_child, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(FenleiChildAdapter.ViewHolder holder, final int position) { holder.childimg.setImageURI(listBean.get(position).icon); holder.childname.setText(listBean.get(position).name); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EventBus.getDefault().postSticky(new FenleiEvent(listBean.get(position).pscid)); Intent intent = new Intent(context, ProductActivity.class); context.startActivity(intent); } }); } @Override public int getItemCount() { return listBean.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public SimpleDraweeView childimg; public TextView childname; public ViewHolder(View itemView) { super(itemView); childimg=itemView.findViewById(R.id.right_child_img); childname=itemView.findViewById(R.id.right_child_name); } } }
public class FenleiEvent { int id; public FenleiEvent(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
public interface LieBiaoIView { void showList(List<FenleiLiebiaoBean.DataBean> list); void showError(String e); }
public interface OnLieBiaoListener { void OnRightSuccess(List<FenleiLiebiaoBean.DataBean> list); void OnError(String e); }
public interface LieBiaoIModel { void RequestRightData(String url,int pscid,int page,int sort,OnLieBiaoListener onLieBiaoListener); }
public class LieBiaoModel implements LieBiaoIModel { @Override public void RequestRightData(String url, int pscid ,int page,int sort,final OnLieBiaoListener onLieBiaoListener) { Map<String,Integer> map=new HashMap<>(); map.put("pscid",pscid); map.put("page",page); map.put("sort",sort); //retrofit网络请求 Retrofit retrofit = new Retrofit .Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); Observable<FenleiLiebiaoBean> fenleiLiebiaoBeanObservable = apiService.getliebiaoData("product/getProducts",map); fenleiLiebiaoBeanObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<FenleiLiebiaoBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onLieBiaoListener.OnError(e.getMessage().toString()); } @Override public void onNext(FenleiLiebiaoBean fenleiLiebiaoBean) { List<FenleiLiebiaoBean.DataBean> data = fenleiLiebiaoBean.data; onLieBiaoListener.OnRightSuccess(data); } }); } }
public interface LieBiaoIPresenter { void loadRightList(String url,int pscid,int page,int sort); }
public class LieBiaoPresenter implements LieBiaoIPresenter { private LieBiaoIView lieBiaoIView; private LieBiaoIModel lieBiaoIModel; public LieBiaoPresenter(LieBiaoIView lieBiaoIView) { this.lieBiaoIView = lieBiaoIView; lieBiaoIModel = new LieBiaoModel(); } @Override public void loadRightList(String url, int pscid,int page,int sort) { lieBiaoIModel.RequestRightData(url, pscid,page,sort, new OnLieBiaoListener() { @Override public void OnRightSuccess(List<FenleiLiebiaoBean.DataBean> list) { lieBiaoIView.showList(list); } @Override public void OnError(String e) { lieBiaoIView.showError(e); } }); } }
public class ProductActivity extends AppCompatActivity implements LieBiaoIView { // @Bind(R.id.liebiaorecycler) RecyclerView liebiaorecycler; private int id; private LieBiaoPresenter lieBiaoPresenter; // @Bind(R.id.pro_id) // TextView proId; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_product); // ButterKnife.bind(this); liebiaorecycler = (RecyclerView) findViewById(R.id.liebiaorecycler); EventBus.getDefault().register(this); lieBiaoPresenter = new LieBiaoPresenter(this); lieBiaoPresenter.loadRightList(Api.HOST,id,1,0); } //在onStart调用register后,执行消息 @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEvent(FenleiEvent event) { id = event.getId(); // lieBiaoPresenter.loadRightList(Api.HOST,id,1,0); // proId.setText(id+""); // Toast.makeText(getContext(),"id"+ android.R.attr.id,Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Override public void showList(List<FenleiLiebiaoBean.DataBean> list) { LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this); liebiaorecycler.setLayoutManager(linearLayoutManager); LieBiaoAdapter lieBiaoAdapter = new LieBiaoAdapter(ProductActivity.this, list); liebiaorecycler.setAdapter(lieBiaoAdapter); } @Override public void showError(String e) { } }
public class LieBiaoAdapter extends RecyclerView.Adapter<LieBiaoAdapter.ViewHolder> { private Context context; private List<FenleiLiebiaoBean.DataBean> liebiaolist=new ArrayList<>(); public LieBiaoAdapter(Context context, List<FenleiLiebiaoBean.DataBean> liebiaolist) { this.context = context; this.liebiaolist = liebiaolist; } @Override public LieBiaoAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.liebiao_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(LieBiaoAdapter.ViewHolder holder, int position) { String images = liebiaolist.get(position).images; if (images!=null){ String[] split = images.split("\\|"); Uri uri = Uri.parse(split[0]); holder.liebiapimg.setImageURI(uri); holder.liebiao_title.setText(liebiaolist.get(position).title); holder.liebiao_price.setText("价格:"+liebiaolist.get(position).price); holder.liebiao_num.setText("销量:"+liebiaolist.get(position).salenum); } } @Override public int getItemCount() { return liebiaolist.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public SimpleDraweeView liebiapimg; public TextView liebiao_title,liebiao_price,liebiao_num; public ViewHolder(View itemView) { super(itemView); liebiapimg=itemView.findViewById(R.id.liebiao_img); liebiao_title=itemView.findViewById(R.id.liebiao_name); liebiao_price=itemView.findViewById(R.id.liebiao_price); liebiao_num=itemView.findViewById(R.id.liebiao_num); } } }
activity_product
<android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/liebiaorecycler"></android.support.v7.widget.RecyclerView>
liebiao_item
<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/liebiao_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="150dp" android:layout_margin="8dp" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/liebiao_name" android:maxLines="2" android:text="cdfd" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/liebiao_price" android:layout_marginTop="5dp" android:maxLines="2" android:text="cdfd"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/liebiao_num" android:maxLines="2" android:layout_marginTop="5dp" android:text="cdfd"/> </LinearLayout> </LinearLayout>
fragment_fenlei
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/fenleileftrecler"></android.support.v7.widget.RecyclerView> <android.support.v7.widget.RecyclerView android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="4" android:id="@+id/fenleirightrecler"></android.support.v7.widget.RecyclerView> </LinearLayout>
fenlei_left_item
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:id="@+id/left_name"/> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/left_img" android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="8dp" fresco:failureImage="@mipmap/ic_launcher" />
fenlei_right_item
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/right_name" android:text="dfd" android:padding="10dp"/> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/childrecycler"></android.support.v7.widget.RecyclerView>
fenlei_right_child
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/right_child_name" android:layout_margin="8dp" android:text="dcdc"/> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/right_child_img" android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="8dp" fresco:failureImage="@mipmap/ic_launcher" /> </LinearLayout>