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

这里写图片描述

先是请求网络数据的部分

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);![这里写图片描述](https://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'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值