仿京东分类实现

   首先我这一块我用的是MVP模式写的这个分类,简单说一下它的布局,就两块,左面一块就是RecyclerView,右面一块是二级列表嵌套RecyclerView,请求的时候

我用的Retrofit+Rxjava+OkHttp的结合请求的数据,废话不多说

直接甩代码,代码有点多,慢慢看。

   先展示一下效果

  

首先看一下接口

  1. public interface Inters {
  2. /**
  3. * 左面接口
  4. */
  5. @GET("product/getCatagory")
  6. Observable<Zean> Zuo();
  7. /**
  8. * 右面接口
  9. */
  10. @GET("product/getProductCatagory")
  11. Observable<Yean> You(@Query("cid") int cid);
  12. }

Retrofit+Rxjava+OkHttp的结合

  1. import okhttp3.OkHttpClient;
  2. import retrofit2.Retrofit;
  3. import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
  4. import retrofit2.converter.gson.GsonConverterFactory;
  5. /**
  6. * Retrofit+Rxjava+OkHttp封装,单例
  7. */
  8. public class RetrofitUnitl {
  9. private Retrofit mRetrofit;
  10. private String baseUrl;
  11. OkHttpClient client;
  12. private static RetrofitUnitl mRetrofitManager;
  13. private RetrofitUnitl(String baseUrl,OkHttpClient client){
  14. this.baseUrl=baseUrl;
  15. this.client=client;
  16. initRetrofit();
  17. }
  18. public static synchronized RetrofitUnitl getInstance(String baseUrl,OkHttpClient client){
  19. if (mRetrofitManager == null){
  20. mRetrofitManager = new RetrofitUnitl(baseUrl,client);
  21. }
  22. return mRetrofitManager;
  23. }
  24. private void initRetrofit() {
  25. mRetrofit = new Retrofit.Builder()
  26. .baseUrl(baseUrl)
  27. .addConverterFactory(GsonConverterFactory.create())
  28. .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
  29. .client(client)
  30. .build();
  31. }
  32. public <T> T setCreate(Class<T> reqServer) {
  33. return mRetrofit.create(reqServer);
  34. }
  35. }

 分类的布局

  1. <LinearLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="horizontal"
  7. tools:context="com.xjq.xinjiaqi20171208.MainActivity">
  8.  
  9. <android.support.v7.widget.RecyclerView
  10. android:id="@+id/zrv"
  11. android:layout_width="130dp"
  12. android:layout_height="match_parent" />
  13.  
  14.  <ExpandableListView
  15. android:id="@+id/yev"
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"></ExpandableListView>
  18.  
  19. </LinearLayout>

左侧bean包 和右侧的bean包我就不写了。

下面开始MVP,首先是V层

  1. public interface IFenView {
  2. void onZuo(Zean zean);//左侧请求成功
  3. void onYou(Yean yean);//右侧请求成功
  4. }

M层

  1. public class FenModel {
  2.  
  3. ScuMod scuMod;
  4.  
  5. public void setScuMod(ScuMod scuMod) {
  6. this.scuMod = scuMod;
  7. }
  8.  
  9. //左面请求
  10. public void ZuoChen(){
  11. //OkHttp里面可以添加拦截器
  12. OkHttpClient ok = new OkHttpClient.Builder()
  13. .build();
  14. //请求数据
  15. RetrofitUnitl.getInstance("https://www.zhaoapi.cn/",ok)
  16. .setCreate(Inters.class)
  17. .Zuo()
  18. .observeOn(AndroidSchedulers.mainThread())
  19. .subscribeOn(Schedulers.io())
  20. .subscribe(new Subscriber<Zean>() {
  21. @Override
  22. public void onCompleted() {
  23.  
  24. }
  25.  
  26. @Override
  27. public void onError(Throwable e) {
  28.  
  29. }
  30.  
  31. @Override
  32. public void onNext(Zean bean) {
  33. scuMod.Zc(bean);
  34. }
  35. });
  36. }
  37.  
  38. //右面请求
  39. public void YuoChen(int cont){
  40. //OkHttp里面可以添加拦截器
  41. OkHttpClient ok = new OkHttpClient.Builder()
  42. .build();
  43. //请求数据
  44. RetrofitUnitl.getInstance("https://www.zhaoapi.cn/",ok)
  45. .setCreate(Inters.class)
  46. .You(cont)
  47. .observeOn(AndroidSchedulers.mainThread())
  48. .subscribeOn(Schedulers.io())
  49. .subscribe(new Subscriber<Yean>() {
  50. @Override
  51. public void onCompleted() {
  52.  
  53. }
  54.  
  55. @Override
  56. public void onError(Throwable e) {
  57.  
  58. }
  59.  
  60. @Override
  61. public void onNext(Yean bean) {
  62. scuMod.Yc(bean);
  63. }
  64. });
  65. }
  66. //定义一个接口
  67. public interface ScuMod{
  68. void Zc(Zean bean);
  69. void Yc(Yean yean);
  70. }
  71. }

P层

  1. //实现M层的接口
  2. public class FenPresenter implements FenModel.ScuMod {
  3.  
  4. IFenView view;
  5. FenModel model;
  6.  
  7. public FenPresenter(IFenView view) {
  8. this.view = view;
  9. model = new FenModel();
  10. model.setScuMod(this);
  11. }
  12.  
  13. @Override
  14. public void Zc(Zean bean) {
  15. view.onZuo(bean);
  16. }
  17.  
  18. @Override
  19. public void Yc(Yean yean) {
  20. view.onYou(yean);
  21. }
  22.  
  23. //左侧调用
  24. public void ShowPer(){
  25. model.ZuoChen();
  26. }
  27. // 右侧调用
  28. public void FlShowYou(int cont){
  29. model.YuoChen(cont);
  30. }
  31. }

我们在主方法里面一定要实现V层

  1. public class MainActivity extends AppCompatActivity implements IFenView{
  2.  
  3. public ExpandableListView yev;
  4. public RecyclerView zrv;
  5. public FenPresenter presenter;
  6.  
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. //拿到P层
  12. presenter = new FenPresenter(this);
  13. presenter.ShowPer();
  14. //默认展示第一条
  15.  presenter.FlShowYou(1);
  16. //找控件
  17. zrv = findViewById(R.id.zrv);
  18. yev = findViewById(R.id.yev);
  19. }
  20.  
  21. @Override
  22. public void onZuo(final Zean zean) {
  23. //线性布局
  24. zrv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
  25. //拿到适配器
  26. ZuoAdapter adapter= new ZuoAdapter(MainActivity.this,zean);
  27. zrv.setAdapter(adapter);
  28. //调用点击事件
  29. adapter.setOnItemClickListener(new ZuoAdapter.OnItemClickListener() {
  30. @Override
  31. public void onItemClick(View view, int position) {
  32. int id = zean.getData().get(position).getCid();
  33. presenter.FlShowYou(id);
  34. }
  35. });
  36. }
  37.  
  38. @Override
  39. public void onYou(Yean yean) {
  40. //拿到适配器
  41. ErAdapter adapter = new ErAdapter(MainActivity.this,yean);
  42. yev.setAdapter(adapter);
  43. //父级列表默认全部展开
  44. int groupCount = yev.getCount();
  45. for (int i=0; i<groupCount; i++)
  46. {
  47. yev.expandGroup(i);
  48. }
  49. }
  50. }

左面RecyclerView的适配器

  1. /**
  2. * 左面适配器
  3. */
  4. public class ZuoAdapter extends RecyclerView.Adapter<ZuoAdapter.MyHolder> {
  5. private Context context;
  6. private Zean zean;
  7. private OnItemClickListener mOnItemClickListener;
  8.  
  9. public ZuoAdapter(Context context, Zean list) {
  10. this.context = context;
  11. this.zean = list;
  12. }
  13. public interface OnItemClickListener{
  14. void onItemClick(View view, int position);
  15. }
  16. public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
  17. this.mOnItemClickListener = mOnItemClickListener;
  18. }
  19. @Override
  20. public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  21. MyHolder holder = new MyHolder(LayoutInflater.from(context).inflate(R.layout.zuo_litem, parent, false));
  22. return holder;
  23. }
  24. @Override
  25. public void onBindViewHolder(final MyHolder holder, int position) {
  26. holder.zuo_mz.setText(zean.getData().get(position).getName());
  27. if (mOnItemClickListener != null){
  28. holder.zuo_mz.setOnClickListener(new View.OnClickListener() {
  29. @Override
  30. public void onClick(View view) {
  31. int position = holder.getLayoutPosition(); // 1
  32. mOnItemClickListener.onItemClick(holder.itemView,position); // 2
  33. }
  34. });
  35. }
  36. }
  37.  
  38. @Override
  39. public int getItemCount() {
  40. return zean.getData().size();
  41. }
  42.  
  43. class MyHolder extends RecyclerView.ViewHolder {
  44. TextView zuo_mz;
  45. public MyHolder(View itemView) {
  46. super(itemView);
  47. zuo_mz = itemView.findViewById(R.id.zuo_mz);
  48. }
  49. }
  50. }

左面适配器的布局

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:orientation="vertical"
  5. >
  6. <TextView
  7. android:id="@+id/zuo_mz"
  8. android:layout_width="match_parent"
  9. android:layout_height="50dp"
  10. android:gravity="center"
  11. android:text="名字"
  12. android:layout_gravity="center"
  13. />
  14. </LinearLayout>

右面二级列表适配器

  1. /**
  2. * 二级列表适配器
  3. */
  4. public class ErAdapter extends BaseExpandableListAdapter{
  5. private Context context;
  6. private Yean yean;
  7.  
  8. public ErAdapter(Context context, Yean yean) {
  9. this.context = context;
  10. this.yean = yean;
  11. }
  12.  
  13. @Override
  14. public int getGroupCount() {
  15. return yean.getData().size();
  16. }
  17.  
  18. @Override
  19. public int getChildrenCount(int i) {
  20. return 1;
  21. }
  22.  
  23. @Override
  24. public Object getGroup(int i) {
  25. return yean.getData().get(i);
  26. }
  27.  
  28. @Override
  29. public Object getChild(int i, int i1) {
  30. return yean.getData().get(i).getList().get(i);
  31. }
  32.  
  33. @Override
  34. public long getGroupId(int i) {
  35. return i;
  36. }
  37.  
  38. @Override
  39. public long getChildId(int i, int i1) {
  40. return i1;
  41. }
  42.  
  43. @Override
  44. public boolean hasStableIds() {
  45. return false;
  46. }
  47.  
  48. @Override
  49. public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
  50. //父级
  51. View v = View.inflate(context, R.layout.you_litem, null);
  52. TextView expand_tv = v.findViewById(R.id.you_you);
  53. expand_tv.setText(yean.getData().get(i).getName());
  54. return v;
  55. }
  56.  
  57. @Override
  58. public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
  59. //嵌套RecyclerView的布局
  60. View v = View.inflate(context,R.layout.youhai_litem,null);
  61. RecyclerView expand_recycler = v.findViewById(R.id.rvClass);
  62. //RecyclerView网格格式
  63. GridLayoutManager gridlayout = new GridLayoutManager(context,3);
  64. expand_recycler.setLayoutManager(gridlayout);
  65. //RecyclerView的适配器
  66. setchild_Aapterer chapter = new setchild_Aapterer(context,yean,i,i1);
  67. expand_recycler.setAdapter(chapter);
  68. return v;
  69. }
  70.  
  71. @Override
  72. public boolean isChildSelectable(int i, int i1) {
  73. return false;
  74. }
  75. }

右面适配器二级列表嵌套的RecyclerView的适配器

  1. /**
  2. * 二级列表嵌套RecyclerView的适配器
  3. */
  4.  
  5. public class setchild_Aapterer extends RecyclerView.Adapter<setchild_Aapterer.ViewHodler>{
  6. private Context context;
  7. private Yean yean;
  8. private int i,i1;
  9. private OnItemClickListener mOnItemClickListener;
  10.  
  11. public setchild_Aapterer(Context context,Yean list,int i,int i1) {
  12. this.context = context;
  13. this.yean = list;
  14. this.i = i;
  15. this.i1 = i1;
  16. }
  17. //点击事件
  18. public interface OnItemClickListener{
  19. void onItemClick(View view, int position);
  20. }
  21. public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
  22. this.mOnItemClickListener = mOnItemClickListener;
  23. }
  24. @Override
  25. public setchild_Aapterer.ViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
  26. View v = View.inflate(context, R.layout.child_item,null);
  27. ViewHodler hodler = new ViewHodler(v);
  28. hodler.img_child = v.findViewById(R.id.img_child);
  29. hodler.tv_child = v.findViewById(R.id.tv_child);
  30. return hodler;
  31. }
  32.  
  33. @Override
  34. public void onBindViewHolder(final setchild_Aapterer.ViewHodler holder, int position) {
  35.  
  36. String[] str =yean.getData().get(i).getList().get(position).getIcon().split("\\|");
  37. String s = str[0];
  38. Glide.with(context).load(s).into(holder.img_child);
  39. holder.tv_child.setText(yean.getData().get(i).getList().get(position).getName());
  40.  
  41. if (mOnItemClickListener != null){
  42. holder.img_child.setOnClickListener(new View.OnClickListener() {
  43. @Override
  44. public void onClick(View view) {
  45. int position =holder.getLayoutPosition();
  46. mOnItemClickListener.onItemClick(holder.itemView,position); //
  47. }
  48. });
  49. }
  50. }
  51.  
  52. @Override
  53. public int getItemCount() {
  54. return yean.getData().get(i).getList().size();
  55. }
  56.  
  57. public class ViewHodler extends RecyclerView.ViewHolder {
  58. private ImageView img_child;
  59. private TextView tv_child;
  60. public ViewHodler(View itemView) {
  61. super(itemView);
  62. }
  63. }
  64. }

child_item

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. >
  7. <ImageView
  8. android:id="@+id/img_child"
  9. android:layout_width="60dp"
  10. android:layout_height="60dp"
  11. android:layout_gravity="center"
  12. />
  13. <TextView
  14. android:id="@+id/tv_child"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:text="名字"
  18. android:layout_gravity="center"
  19. />
  20.  
  21.  
  22. </LinearLayout>

--------------------- 本文来自 小神奇 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Star_Q/article/details/78607341?utm_source=copy

posted @ 2018-10-08 10:51  天涯海角路  阅读(553)  评论(0)    收藏  举报