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實(shí)現(xiàn)
Recyclerview在MainActivity中顯示

我們運(yùn)用Retrofit和Rxjava 要添加一個(gè)包:retrofit
retrofit里面有一個(gè)接口: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
 * 說(shuō)明:
 */

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);
}

可以看出我們?cè)贏PI里面創(chuàng)建了Retrofit,以及ok的攔截器
那么我們給出的攔截器(網(wǎng)絡(luò)攔截器)實(shí)例是:LoggingInterceptor
這個(gè)實(shí)例是不需要我們寫的啊胶,但是沒有加網(wǎng)絡(luò)攔截器的話死相,就會(huì)請(qǐng)求不到地址(其他的接口可能沒有此攔截器)

package com.example.mvprecyclerviewretrofitrxjavademo.retrofit;

import android.os.Build;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * 網(wǎng)絡(luò)攔截器
 */

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
以及在清單文件里加入網(wǎng)絡(luò)權(quán)限*******

package com.example.testzhoukaotablayoutretrofit;

import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

/**
 * 作者:author
 * 時(shí)間 :
 * 說(shuō)明:
 */

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
 * 說(shuō)明:
 */

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
 * 時(shí)間 :
 * 說(shuō)明:
 */

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
 * 說(shuō)明:
 */

public interface IshowView {
    public void getData(List<RetroBean.SongListBean> listb);
}

presenter:
Ipresenter接口:

package com.example.testzhoukaotablayoutretrofit.presenter;

/**
 * 作者:author
 * 時(shí)間 :
 * 說(shuō)明:
 */

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
 * 說(shuō)明:
 */

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
 * 說(shuō)明:
 */

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解綁需要一個(gè)Base類來(lái)實(shí)現(xiàn):
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
 * 說(shuō)明:
 */

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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屿岂,一起剝皮案震驚了整個(gè)濱河市怠苔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玉掸,老刑警劉巖伴挚,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沦辙,居然都是意外死亡夫植,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門油讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)详民,“玉大人延欠,你說(shuō)我怎么就攤上這事∩蚩纾” “怎么了由捎?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饿凛。 經(jīng)常有香客問(wèn)我狞玛,道長(zhǎng),這世上最難降的妖魔是什么笤喳? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任为居,我火速辦了婚禮,結(jié)果婚禮上杀狡,老公的妹妹穿的比我還像新娘蒙畴。我一直安慰自己,他們只是感情好呜象,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布膳凝。 她就那樣靜靜地躺著,像睡著了一般恭陡。 火紅的嫁衣襯著肌膚如雪蹬音。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天休玩,我揣著相機(jī)與錄音著淆,去河邊找鬼。 笑死拴疤,一個(gè)胖子當(dāng)著我的面吹牛永部,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呐矾,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼苔埋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蜒犯?” 一聲冷哼從身側(cè)響起组橄,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罚随,沒想到半個(gè)月后玉工,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淘菩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年瓮栗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡费奸,死狀恐怖弥激,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愿阐,我是刑警寧澤微服,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站缨历,受9級(jí)特大地震影響以蕴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辛孵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一丛肮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魄缚,春花似錦宝与、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嚼隘,卻和暖如春诽里,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飞蛹。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工谤狡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卧檐。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓墓懂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泄隔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容