美文网首页
An_Retrofit+Rxjava(checkbox)

An_Retrofit+Rxjava(checkbox)

作者: android_en | 来源:发表于2017-11-05 20:31 被阅读84次

    首先我们要做的是添加各种依赖:
    先看我的build.gradle

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.2"
    
        defaultConfig {
            applicationId "com.example.mvprecyclerviewretrofitrxjavademo"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:26.+'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
        compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
        compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
        compile 'com.squareup.okhttp3:okhttp:3.1.2'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
        compile 'io.reactivex:rxjava:1.1.0'
        compile 'io.reactivex:rxandroid:1.1.0'
        compile 'com.google.code.gson:gson:2.6.2'
        compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
        compile 'com.facebook.fresco:fresco:0.11.0'
    }
    
    

    再然后我用的是MVP模式写的Recyclerview实现
    Recyclerview在MainActivity中显示

    我们运用Retrofit和Rxjava 要添加一个包:retrofit
    retrofit里面有一个接口:RetroAPI

    package com.example.mvprecyclerviewretrofitrxjavademo.retrofit;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    
    import okhttp3.OkHttpClient;
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;
    import retrofit2.http.GET;
    import rx.Observable;
    
    /**
     * 作者:author
     * 说明:
     */
    
    public interface RetroAPI {
        @GET("v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0")
        Observable<RetroBean> getRetro();
        OkHttpClient CLIENT=new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .build();
        Retrofit RETROFIT=new Retrofit.Builder()
                .baseUrl("http://tingapi.ting.baidu.com/")
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .client(CLIENT)
                .build();
        RetroAPI RETRO_API=RETROFIT.create(RetroAPI.class);
    }
    
    

    可以看出我们在API里面创建了Retrofit,以及ok的拦截器
    那么我们给出的拦截器(网络拦截器)实例是:LoggingInterceptor
    这个实例是不需要我们写的,但是没有加网络拦截器的话,就会请求不到地址(其他的接口可能没有此拦截器)

    package com.example.mvprecyclerviewretrofitrxjavademo.retrofit;
    
    import android.os.Build;
    
    import java.io.IOException;
    
    import okhttp3.Interceptor;
    import okhttp3.Request;
    import okhttp3.Response;
    
    /**
     * 网络拦截器
     */
    
    public class LoggingInterceptor implements Interceptor {
        private static final String UA = "User-Agent";
    
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request()
                    .newBuilder()
                    .addHeader(UA, makeUA())
                    .build();
            return chain.proceed(request);
        }
    
        private String makeUA() {
            String s = Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE;
            return Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE;
        }
    
    }
    
    

    MyApp: 初始化fresco 别忘了在清单文件里加入name
    以及在清单文件里加入网络权限*******

    package com.example.testzhoukaotablayoutretrofit;
    
    import android.app.Application;
    
    import com.facebook.drawee.backends.pipeline.Fresco;
    
    /**
     * 作者:author
     * 时间 :
     * 说明:
     */
    
    public class MyApp extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            Fresco.initialize(this);
        }
    }
    
    

    Model:
    IshowModel

    package com.example.mvprecyclerviewretrofitrxjavademo.model;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    
    import java.util.List;
    
    /**
     * 作者:author
     * 说明:
     */
    
    public interface IshowModel {
        public void showData(Callback callback);
        interface Callback{
            void complate(List<RetroBean.SongListBean> listb);
        }
    }
    

    ShowModel:

    package com.example.mvprecyclerviewretrofitrxjavademo.model;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    import com.example.mvprecyclerviewretrofitrxjavademo.retrofit.RetroAPI;
    
    import java.util.List;
    
    import rx.Observer;
    import rx.android.schedulers.AndroidSchedulers;
    import rx.schedulers.Schedulers;
    
    /**
     * 作者:author
     * 时间 :
     * 说明:
     */
    
    public class showModel implements IshowModel {
        @Override
        public void showData(final Callback callback) {
            RetroAPI.RETRO_API.getRetro()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<RetroBean>() {
                        @Override
                        public void onCompleted() {
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onNext(RetroBean retroBean) {
                            List<RetroBean.SongListBean> list=retroBean.getSong_list();
                            callback.complate(list);
                        }
                    });
        }
    }
    

    view:

    package com.example.mvprecyclerviewretrofitrxjavademo.view;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    
    import java.util.List;
    
    /**
     * 作者:author
     * 说明:
     */
    
    public interface IshowView {
        public void getData(List<RetroBean.SongListBean> listb);
    }
    

    presenter:
    Ipresenter接口:

    package com.example.testzhoukaotablayoutretrofit.presenter;
    
    /**
     * 作者:author
     * 时间 :
     * 说明:
     */
    
    public interface Ipresenter <T>{
        void attach(T view);
        void detach();
    }
    
    

    Presenter类

    package com.example.mvprecyclerviewretrofitrxjavademo.presenter;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    import com.example.mvprecyclerviewretrofitrxjavademo.model.IshowModel;
    import com.example.mvprecyclerviewretrofitrxjavademo.model.showModel;
    import com.example.mvprecyclerviewretrofitrxjavademo.view.IshowView;
    
    import java.lang.ref.SoftReference;
    import java.util.List;
    
    /**
     * 作者:author
     * 说明:
     */
    
    public class ShowPresenter implements Ipresenter<IshowView> {
        IshowModel model;
        IshowView view;
        SoftReference<IshowView> srf;
        public ShowPresenter( IshowView view){
            this.view=view;
            model=new showModel();
            attach(view);
        }
        public void showData(){
            model.showData(new IshowModel.Callback() {
                @Override
                public void complate(List<RetroBean.SongListBean> listb) {
                    srf.get().getData(listb);
                }
            });
        }
        @Override
        public void attach(IshowView view) {
            srf=new SoftReference<IshowView>(view);
        }
    
        @Override
        public void detach() {
            srf.clear();
        }
    }
    
    

    Adapter:

    package com.example.mvprecyclerviewretrofitrxjavademo.adapter;
    
    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.CheckBox;
    import android.widget.TextView;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.R;
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    import com.facebook.drawee.backends.pipeline.Fresco;
    import com.facebook.drawee.interfaces.DraweeController;
    import com.facebook.drawee.view.SimpleDraweeView;
    
    import java.util.HashMap;
    import java.util.List;
    
    /**
     * 作者:author
     * 说明:
     */
    
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.myViewHolder> {
        Context context;
        List<RetroBean.SongListBean> listb;
        private boolean isShow = false;
        private boolean isSelect = false;
        private static HashMap<Integer, Boolean> isSelected;
        public MyAdapter(Context context, List<RetroBean.SongListBean> listb,boolean isShow,boolean isSelect) {
            this.context = context;
            this.listb = listb;
            isSelected = new HashMap<Integer, Boolean>();
            this.isShow=isShow;
            this.isSelect=isSelect;
        }
    
        @Override
        public myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
           View view=View.inflate(context,R.layout.items,null);
            myViewHolder myViewHolder = new myViewHolder(view);
            return myViewHolder;
        }
    
        @Override
        public void onBindViewHolder(final myViewHolder holder, int position) {
            holder.tvs.setText(listb.get(position).getTitle());
            DraweeController controller= Fresco.newDraweeControllerBuilder()
                    .setUri(listb.get(position).getPic_small())
                    .setAutoPlayAnimations(true)
                    .build();
            holder.sdv.setController(controller);
    
            if(isShow){
                holder.checkboxnum.setVisibility(View.VISIBLE);
                holder.checkboxnum.setChecked(isSelect);
    
            }else{
                holder.checkboxnum.setVisibility(View.GONE);
            }
        }
        @Override
        public int getItemCount() {
            return listb==null?0:listb.size();
        }
    
        class myViewHolder extends RecyclerView.ViewHolder{
            TextView tvs;
            CheckBox checkboxnum;
            SimpleDraweeView sdv;
            public myViewHolder(View itemView) {
                super(itemView);
                tvs=itemView.findViewById(R.id.tvs);
                checkboxnum=itemView.findViewById(R.id.checkboxnum);
                sdv=itemView.findViewById(R.id.sdv);
            }
        }
    
    }
    

    MainActivity:

    package com.example.mvprecyclerviewretrofitrxjavademo;
    
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.adapter.MyAdapter;
    import com.example.mvprecyclerviewretrofitrxjavademo.bean.RetroBean;
    import com.example.mvprecyclerviewretrofitrxjavademo.presenter.ShowPresenter;
    import com.example.mvprecyclerviewretrofitrxjavademo.view.IshowView;
    
    import java.util.List;
    
    public class MainActivity extends BaseActivity<ShowPresenter> implements IshowView, View.OnClickListener {
    
        private RecyclerView mRv;
        ShowPresenter presenter;
        MyAdapter myAdapter;
        List<RetroBean.SongListBean> lists;
        List<String> list;
        boolean isshow = true;
        CheckBox checkboxall;
        private Button mBtback;
        private TextView mBianji;
        private RelativeLayout mLlhead;
        private LinearLayout mLl;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            presenter.showData();
            initView();
    
        }
    
        @Override
        protected void createpresenter() {
            presenter = new ShowPresenter(this);
        }
    
        private void initView() {
            mRv = (RecyclerView) findViewById(R.id.rv);
            LinearLayoutManager llm = new LinearLayoutManager(this);
            mRv.setLayoutManager(llm);
            checkboxall = (CheckBox) findViewById(R.id.checkboxall);
            mBtback = (Button) findViewById(R.id.btback);
            mBtback.setOnClickListener(this);
            mBianji = (TextView) findViewById(R.id.bianji);
            mLlhead = (RelativeLayout) findViewById(R.id.llhead);
            mLl = (LinearLayout) findViewById(R.id.ll);
            checkboxall.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean b) {
                    if(b){
                        mRv.setAdapter(new MyAdapter(MainActivity.this,lists,true,true));
                    }else{
                        mRv.setAdapter(new MyAdapter(MainActivity.this,lists,true,false));
                    }
                }
            });
            mBianji.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(isshow){
                        mBianji.setText("完成");
                        mLl.setVisibility(View.VISIBLE);
                        mRv.setAdapter(new MyAdapter( MainActivity.this,lists, isshow,false));
                        isshow = false;
                    }else{
                        mBianji.setText("编辑");
                        mLl.setVisibility(View.GONE);
                        mRv.setAdapter(new MyAdapter( MainActivity.this,lists, isshow,false));
                        isshow = true;
                    }
                }
            });
        }
    
        @Override
        public void getData(final List<RetroBean.SongListBean> listb) {
            lists = listb;
            myAdapter = new MyAdapter(MainActivity.this, lists, false, false);
            mRv.setAdapter(myAdapter);
    
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btback:
                    if(isshow){
                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                        builder.setMessage("是否要退出");
                        builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                finish();
                            }
                        });
                        builder.setNegativeButton("否", null);
                        builder.create().show();
                    }else{
                        mBianji.setText("编辑");
                        mLl.setVisibility(View.GONE);
                        mRv.setAdapter(new MyAdapter(MainActivity.this,lists,isshow,checkboxall.isChecked()));
                        isshow = true;
                    }
                    break;
                default:
                    break;
            }
        }
    }
    
    

    Mvp解绑需要一个Base类来实现:
    BaseActivity:

    package com.example.mvprecyclerviewretrofitrxjavademo;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    
    import com.example.mvprecyclerviewretrofitrxjavademo.presenter.Ipresenter;
    
    /**
     * 作者:author
     * 说明:
     */
    
    public abstract class BaseActivity<T extends Ipresenter> extends Activity{
        T presenter;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            createpresenter();
        }
    
        protected abstract void createpresenter();
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if(presenter!=null){
                presenter.detach();
            }
        }
    }
    
    

    最后把布局show一下:
    MainActivity的layout:

    <?xml version="1.0" encoding="utf-8"?>
    <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"
        tools:context="com.example.mvprecyclerviewretrofitrxjavademo.MainActivity">
        <RelativeLayout
            android:layout_width="match_parent"
            android:id="@+id/llhead"
            android:layout_height="wrap_content"
            >
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/btback"
                android:text="back"/>
            <TextView
                android:id="@+id/bianji"
                android:text="编辑"
                android:layout_width="60dp"
                android:layout_alignParentRight="true"
                android:layout_height="wrap_content" />
        </RelativeLayout>
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_below="@+id/llhead"
            android:layout_height="match_parent"
            android:layout_above="@+id/ll"
            android:id="@+id/rv"></android.support.v7.widget.RecyclerView>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:id="@+id/ll"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal">
            <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/checkboxall"
                android:textSize="20sp"
                android:text="全选"/>
    
    
        </LinearLayout>
    
    </RelativeLayout>
    
    

    items条目的布局:

    <?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">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <CheckBox
                android:id="@+id/checkboxnum"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <com.facebook.drawee.view.SimpleDraweeView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:id="@+id/sdv"/>
            <TextView
                android:id="@+id/tvs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="28sp" />
        </LinearLayout>
    
    </LinearLayout>
    

    相关文章

      网友评论

          本文标题:An_Retrofit+Rxjava(checkbox)

          本文链接:https://www.haomeiwen.com/subject/pmehmxtx.html