MVP+Retrofit+RxJava请求网络数据实现RecyclerView多条目展示

来源:互联网 发布:爱伦坡黑猫 知乎 编辑:程序博客网 时间:2024/05/18 02:39

这里写图片描述

先是请求网络数据的部分

public interface IBannerView {    public void showBData(List<BannerBean.RetBean.ListBean.ChildListBean> bannerlist);}public interface IBannerModel {    public void getBData(Observer observer);}public class BannerModel implements IBannerModel {    @Override    public void getBData(Observer observer) {        OkHttpClient client=new OkHttpClient.Builder().build();        RetrofitManager.getInstance("http://api.svipmovie.com/front/",client)                .setCreate(BannerUrl.class).getBanner()                .observeOn(AndroidSchedulers.mainThread())                .subscribeOn(Schedulers.io())                .subscribe(observer);    }}public class BannerPresenter {    IBannerView view;    BannerModel model;    List<BannerBean.RetBean.ListBean.ChildListBean> bannerlist=new ArrayList<>();    public BannerPresenter(IBannerView view) {        this.view = view;        model=new BannerModel();    }    public void bpData(){        model.getBData(new Observer<BannerBean>(){            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {                Log.i("------","onError()"+e.toString());            }            @Override            public void onNext(BannerBean bannerBean) {                bannerlist.addAll(bannerBean.getRet().getList().get(0).getChildList());                view.showBData(bannerlist);                Log.i("------","onNext()"+bannerlist);            }        });    }}

适配器中

public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    Context context;    List<BannerBean.RetBean.ListBean.ChildListBean> bannerlist;    OnItemClickListener listener;    public static final int TYPE_HEADER=0;    public static final int TYPE_ONE=1;    **List<View> listheader=new ArrayList<View>();    public void addheader(View view){        listheader.add(view);    }**    public interface OnItemClickListener{        public void OnItemClick(View view,int position,String id);    }    public void setOnItemClick(OnItemClickListener listener){        this.listener=listener;    }    public RvAdapter(Context context, List<BannerBean.RetBean.ListBean.ChildListBean> bannerlist) {        this.context = context;        this.bannerlist = bannerlist;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if(viewType==TYPE_HEADER){            View view1 = View.inflate(context, R.layout.bn_item, null);            return new BnViewHolder(view1);        }else {            View view2 = View.inflate(context, R.layout.rv_item, null);            return new RvViewHolder(view2);        }    }    @Override    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {    //给banner赋值        if(holder instanceof BnViewHolder){            ArrayList<String> pic=new ArrayList<>();            for(int i=0;i<bannerlist.size();i++){                pic.add(bannerlist.get(i).getPic());            }            ((BnViewHolder)holder).banner.setImages(pic);            ((BnViewHolder)holder).banner.setImageLoader(new BnImageLoader());            ((BnViewHolder)holder).banner.start();        }        if(holder instanceof RvViewHolder){            ((RvViewHolder)holder).sdv_rv.setImageURI(bannerlist.get(position).getPic());            ((RvViewHolder)holder).tv_rv.setText(bannerlist.get(position).getTitle());        }        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(listener!=null){                    listener.OnItemClick(view,position,bannerlist.get(position).getDataId());                }            }        });    }    @Override    public int getItemCount() {        return bannerlist!=null?bannerlist.size():0;    }    @Override    public int getItemViewType(int position) {        if(position < listheader.size()){            return TYPE_HEADER;        }else {            return TYPE_ONE;        }    }    class RvViewHolder extends RecyclerView.ViewHolder{        SimpleDraweeView sdv_rv;        TextView tv_rv;        public RvViewHolder(View itemView) {            super(itemView);            sdv_rv=itemView.findViewById(R.id.sdv_rv);            tv_rv=itemView.findViewById(R.id.tv_rv);        }    }    //banner的ViewHolder    class BnViewHolder extends RecyclerView.ViewHolder{        Banner banner;        public BnViewHolder(View itemView) {            super(itemView);            banner=itemView.findViewById(R.id.banner);        }    }}

Activity中

public class MainActivity extends AppCompatActivity implements IBannerView {    RvAdapter rvAdapter;    private RecyclerView mRv;    BannerPresenter bannerPresenter;    List<BannerBean.RetBean.ListBean.ChildListBean> bannerlist=new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        bannerPresenter=new BannerPresenter(this);        showBData(bannerlist);        bannerPresenter.bpData();    }    @Override    public void showBData(List<BannerBean.RetBean.ListBean.ChildListBean> bannerlist) {        LinearLayoutManager manager=new LinearLayoutManager(this);        mRv.setLayoutManager(manager);        rvAdapter=new RvAdapter(this,bannerlist);        mRv.setAdapter(rvAdapter);        **Banner banner=new Banner(this);        rvAdapter.addheader(banner);**        rvAdapter.setOnItemClick(new RvAdapter.OnItemClickListener() {            @Override            public void OnItemClick(View view, int position, String id) {                Intent intent = new Intent(MainActivity.this, DetailsActivity.class);                intent.putExtra("id",id);![这里写图片描述](http://img.blog.csdn.net/20171220193100505?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzQwMzk3MjM4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)                startActivity(intent);            }        });    }    private void initView() {        mRv = (RecyclerView) findViewById(R.id.rv);    }}

下面就是一些工具类了

public interface BannerUrl {    @GET("homePageApi/homePage.do")    Observable<BannerBean> getBanner();}//Retrofit二次封装public class RetrofitManager {    private Retrofit mRetrofit;    private String baseUrl;    OkHttpClient client;//有关拦截器    private static RetrofitManager mRetrofitManager;    private RetrofitManager(){}    private RetrofitManager(String baseUrl, OkHttpClient client){        this.baseUrl=baseUrl;        this.client=client;//有关拦截器        initRetrofit();    }    public static synchronized RetrofitManager getInstance(String baseUrl, OkHttpClient client){//有关拦截器        if (mRetrofitManager == null){            mRetrofitManager = new RetrofitManager(baseUrl,client);        }        return mRetrofitManager;    }    private void initRetrofit() {        mRetrofit = new Retrofit.Builder()                .baseUrl(baseUrl)                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .client(client)//有关拦截器                .build();    }    public <T> T setCreate(Class<T> reqServer){        return mRetrofit.create(reqServer);    }

布局的啦
主布局

<RelativeLayout 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:background="@color/colorPrimary"    tools:context="com.example.lastexam.MainActivity">    <!--<com.youth.banner.Banner-->        <!--android:id="@+id/banner"-->        <!--android:layout_width="match_parent"-->        <!--android:layout_height="200dp"></com.youth.banner.Banner>-->    <android.support.v7.widget.RecyclerView        android:id="@+id/rv"        android:layout_marginTop="10dp"        android:layout_width="match_parent"        android:layout_height="match_parent"        ></android.support.v7.widget.RecyclerView>    <EditText        android:id="@+id/ss"        android:layout_width="350dp"        android:background="@drawable/yuanjiao"        android:layout_height="50dp"        android:layout_centerHorizontal="true"        android:hint="一念天堂"        android:textColor="@android:color/white"        /></RelativeLayout>

banner的

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"    android:layout_height="match_parent">    <com.youth.banner.Banner        android:id="@+id/banner"        android:layout_width="match_parent"        android:layout_height="200dp"></com.youth.banner.Banner></LinearLayout>

下面的recyclerview的

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <com.facebook.drawee.view.SimpleDraweeView        android:layout_marginTop="10dp"        android:id="@+id/sdv_rv"        android:layout_width="600dp"        android:layout_height="200dp" />    <TextView        android:id="@+id/tv_rv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="111111"        android:layout_gravity="center_horizontal"        android:textColor="@android:color/white"        /></LinearLayout>

依赖

compile 'com.youth.banner:banner:1.4.9'    compile 'com.android.support:recyclerview-v7:26.1.0'    compile 'com.facebook.fresco:fresco:0.11.0'    compile 'com.squareup.retrofit2:retrofit:2.0.2'    compile 'com.squareup.okhttp3:okhttp:3.1.2'    compile 'com.squareup.retrofit2:converter-gson:2.0.2'    //若和观察者结合的话,需加上如下依赖:    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'    compile 'io.reactivex:rxjava:1.0.14'    compile 'io.reactivex:rxandroid:1.0.1'    compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.5'
阅读全文
0 0
原创粉丝点击