用到的依赖
compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.facebook.fresco:fresco:1.5.0' }请求方式
public interface IGetDataBase { //https://www.zhaoapi.cn/product/getCatagory //https://www.zhaoapi.cn/product/getProductCatagory?cid=1 @GET("/product/getCatagory") //{user} Observable<SvBean> getSv(); //@Path("user") String user @GET("product/getProductCatagory") Observable<ElvBean> getElv(@Query("cid") int cid); }View层
public interface SuccessIf { void SuccessSv(SvBean svBean); void FailureSv(SvBean e); void SuccessElv(ElvBean elvBean); void FailureElv(Exception e); int getCid(); }Modle层的左侧接口
public interface SuccessModle { void SuccessSv(SvBean svBean); void FailureSv(SvBean e); }Modle层右侧的接口
public interface SuccessModleElv { void SuccessElv(int cid,ElvBean elvBean); void FailureElv(Exception e); }Modle层的实体类
public class SuccessModles { //左侧请求 public void getSv(final SuccessModle successModle){ Observable<SvBean>call = App.iGetDataBase.getSv(); call.subscribeOn(Schedulers.io())//子线程 .observeOn(AndroidSchedulers.mainThread())//主线程 .subscribe(new Consumer<SvBean>() { @Override //请求bean包 public void accept(SvBean svBean) throws Exception { successModle.SuccessSv( svBean); } }); } //右侧请求 public void getElv(final int cid,final SuccessModleElv successModleElv){ // Map<String, String> map = new HashMap<>(); // map.put("cid","1"); Observable<ElvBean> call = App.iGetDataBase.getElv(cid); call.subscribeOn(Schedulers.io())//子线程 .observeOn(AndroidSchedulers.mainThread())//主线程 .subscribe(new Consumer<ElvBean>() { @Override //请求bean包 public void accept(ElvBean bean) throws Exception { successModleElv.SuccessElv(cid,bean); } }); } }Presneter层
public class SuccessPrenter { SuccessModles successModles;//Modle层的实体类 WeakReference<SuccessIf> successIf; //view层 public SuccessPrenter(SuccessIf successIf) { this.successModles = new SuccessModles(); datach(successIf); } //左侧请求 public void getSv() { successModles.getSv(new SuccessModle() { @Override public void SuccessSv(SvBean svBean) { if (successIf != null) { successIf.get().SuccessSv(svBean); } } @Override public void FailureSv(SvBean e) { } }); } //右侧 public void getElv() { int cid = successIf.get().getCid(); successModles.getElv(cid,new SuccessModleElv() { @Override public void SuccessElv(int cid,ElvBean elvBean) { if (successIf != null) { successIf.get().SuccessElv(elvBean); } } @Override public void FailureElv(Exception e) { } }); } // 绑定 内存泄漏 public void datach(SuccessIf view) { successIf = new WeakReference(view); } //解绑 public void data() { successIf.clear(); } }请求的初始化和图片框架的初始化
public class App extends Application { public static IGetDataBase iGetDataBase; //这是定义的网络请求接口 @Override public void onCreate() { super.onCreate(); //Fresco图片加载的框架 初始化 Fresco.initialize(this); //Retrofit网络请求 这里放的是请求头 因为这里是初始化 数据先走这里 http://v.juhe.cn请求头 Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.zhaoapi.cn") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); iGetDataBase= retrofit.create(IGetDataBase.class); } }左侧请求的适配器
public class SvApdata extends RecyclerView.Adapter<SvApdata.ViewHolder> implements View.OnClickListener{ Context context; SvBean svBean; private OnItemClickListener mOnItemClickListener = null; public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } public SvApdata(Context context, SvBean svBean) { this.context = context; this.svBean = svBean; } @Override public SvApdata.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.sv_buju,null); view.setOnClickListener(this); return new ViewHolder(view); } @Override public void onBindViewHolder(SvApdata.ViewHolder holder, final int position) { holder.tvS.setText(svBean.getData().get(position).getName()); holder.itemView.setTag(position); } @Override public int getItemCount() { return svBean.getData().size(); } @Override public void onClick(View view) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取position mOnItemClickListener.onItemClick(view,(int)view.getTag()); } } public class ViewHolder extends RecyclerView.ViewHolder { TextView tvS; public ViewHolder(View itemView) { super(itemView); tvS = itemView.findViewById(R.id.tvS); } } public static interface OnItemClickListener { void onItemClick(View view , int position); } }
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/tvS" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>右侧的适配器
public class ElvApdata extends RecyclerView.Adapter<RecyclerView.ViewHolder> { Context context; ElvBean elvBeans; private OnItemClickListener onItemClickListener; public ElvApdata(Context context, ElvBean elvBeans) { this.context = context; this.elvBeans = elvBeans; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.right_item, null); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((MyViewHolder)holder).tv.setText(elvBeans.getData().get(position).getName()); MyGridViewAdapter adapter = new MyGridViewAdapter(context,elvBeans); ((MyViewHolder)holder).gv.setAdapter(adapter); } @Override public int getItemCount() { if (elvBeans != null){ return elvBeans.getData().size(); } return 0; } static class MyViewHolder extends RecyclerView.ViewHolder{ @BindView(R.id.tv) TextView tv; @BindView(R.id.gv) GridView gv; MyViewHolder(View view) { super(view); ButterKnife.bind(this, view); } } public interface OnItemClickListener{ void onItemock(View view, int position); } }
布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:textSize="20dp" android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="123"/> <GridView android:id="@+id/gv" android:layout_marginTop="20dp" android:layout_width="match_parent" android:layout_height="match_parent" android:numColumns="3"> </GridView> </LinearLayout>
下面是右面适配器里面包裹的适配器
public class MyGridViewAdapter extends BaseAdapter { Context context; ElvBean elvBeans; private OnItemClickListener onItemClickListener; public MyGridViewAdapter(Context context, ElvBean elvBeans) { this.context = context; this.elvBeans = elvBeans; } @Override public int getCount() { return elvBeans==null ?0:elvBeans.getData().size(); } @Override public Object getItem(int i) { return 0; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder holder = null; if (view == null){ holder = new ViewHolder(); view = View.inflate(context, R.layout.gridview_item,null); holder.tv = view.findViewById(R.id.tv); holder.sim = view.findViewById(R.id.sim); view.setTag(holder); }else { holder = (ViewHolder) view.getTag(); } holder.tv.setText(elvBeans.getData().get(i).getList().get(i).getName()); DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(Uri.parse(elvBeans.getData().get(i).getList().get(i).getIcon())) .build(); holder.sim.setController(controller); return view; } class ViewHolder{ SimpleDraweeView sim; TextView tv; } public interface OnItemClickListener{ void onItemock(View view, int position); } }布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sim" android:layout_width="70dp" android:layout_height="70dp" android:layout_gravity="center"/> <TextView android:id="@+id/tv" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> </LinearLayout>主方法
public class MainActivity extends AppCompatActivity implements SuccessIf{ @BindView(R.id.rv) RecyclerView rv; @BindView(R.id.rv2) RecyclerView rv2; SuccessPrenter successPrenter; int cid; //https://www.zhaoapi.cn/product/getCatagory //https://www.zhaoapi.cn/product/getProductCatagory?cid=1 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); successPrenter = new SuccessPrenter(this); successPrenter.getSv(); successPrenter.getElv(); } @Override public void SuccessSv(final SvBean svBean) { //线性布局 rv.setLayoutManager(new LinearLayoutManager(this)); //拿到适配器 SvApdata adapter= new SvApdata(this,svBean); rv.setAdapter(adapter); adapter.setOnItemClickListener(new SvApdata.OnItemClickListener(){ @Override public void onItemClick(View view , int position){ cid = svBean.getData().get(position).getCid(); successPrenter.getElv(); } }); } @Override public void FailureSv(SvBean e) { } @Override public void SuccessElv(ElvBean elvBeans) { LinearLayoutManager mgs = new LinearLayoutManager(this); rv2.setLayoutManager(mgs); //拿到适配器 ElvApdata adapter = new ElvApdata(this,elvBeans); rv2.setAdapter(adapter); } @Override public void FailureElv(Exception e) { } @Override public int getCid() { return cid; } }
主布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.fenglei.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="80dp" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> <android.support.v7.widget.RecyclerView android:id="@+id/rv2" android:layout_marginLeft="30dp" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout>