An_Retrofit+Rxjava(checkbox)

首先我们要做的是添加各种依赖:
先看我的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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容