MVP+Retrofit网络请求和添加拦截器+Fresco+全选反选与删除

效果图



我们先导入依赖

    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.1'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    compile 'com.android.support:mediarouter-v7:25.0.0'
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile 'com.android.support:recyclerview-v7:25.0.0'
//fresco
    compile 'com.facebook.fresco:fresco:0.12.0'

然后加入网络权限
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>


因为用MVP模式实现,所以在main文件夹下创建module,view,presenter3个文件夹


然后布局  activity_main.xml

   <LinearLayout
        android:id="@+id/buju"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:text="返回"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button" />

        <TextView
            android:text="我的收藏"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView"
            android:textSize="20dp"
            android:gravity="center"
            android:layout_weight="2"/>

        <Button
            android:id="@+id/btn_bj"
            android:text="编辑"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:layout_below="@+id/buju"
        android:id="@+id/id_recyclerview"
        android:dividerHeight="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/caozuolayout"
        android:orientation="horizontal"
        >
        <CheckBox
            android:layout_width="80dp"
            android:layout_height="50dp"
            android:id="@+id/checkall"
            android:text="全选"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btn_delete"
            android:text="删除"
            android:background="@android:color/white"
            />
    </LinearLayout>

然后是recyclerview的item.xml子布局
    <CheckBox
        android:layout_width="80dp"
        android:layout_height="50dp"
        android:id="@+id/mycheck"
        />

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image"
        android:layout_width="90dp"
        android:layout_height="90dp"
        fresco:placeholderImage="@mipmap/ic_launcher"
        />


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
    </LinearLayout>

创建bean包,在里边创建封装类,封装你所需要的数据


创建一个API类,里边放着我们需要请求的网址(我用的是拼接法)

public class API{
    public static final String BASE_URL= "http://tingapi.ting.baidu.com/";
}

创建一个ApiService类,用来拼接网址和调用请求网络数据的方法

public interface ApiService {

    @GET("v1/restserver/ting?method=baidu.ting.billboard.billList&type=1&size=10&offset=0")
    Observable<NewsBean> getNoParams();
}

MVP实现

在module下创建IModel接口

/**
 * Model中定义一个接口
 *
 * 定义一个解析数据的方法(传入url路径)
 */

public interface IModel {
    void getJson(String url);
}

然后创建UserModel,它的实现类

   这里边有实现retrofit方法retrofit添加拦截的方法(实例化OKhttpclient.builder,然后添加拦截器,要用你自己所需要的拦截器类,之后一定要记得在下边的代码:创建retrofit中,要添加上刚刚实例化的OKhttp对象,这样的话拦截器就添加成功了)

/**
 * IModel的实现类,用来处理耗时操作
 */

public class UserModel implements IModel{
    ArrayList<NewsBean.SongListBean> list=new ArrayList<>();
    private OnFinishLisenter lisenter;

    //定义一个公开的接口,可以写成外部接口
    public interface OnFinishLisenter{
        //得到数据
        void OnFinish(ArrayList<NewsBean.SongListBean> list);
    }
    public void setOnUserModel(OnFinishLisenter lisenter) {
        this.lisenter = lisenter;
    }

    /*
    * 重写IModel中 请求数据的方法
    * */
    @Override
    public void getJson(String url) {
        //初始化okhttpclient
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())//这里添加拦截器,我的拦截器是LoggingInterceptor()
                .build();

        //创建Retrofit(多添加一句话.client)
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(okHttpClient)//把有拦截器的 okhttp对象放入retrofit
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        //动态代理
        ApiService apiService = retrofit.create(ApiService.class);
        //得到Observable
        Observable<NewsBean> observable = apiService.getNoParams();//获取数据源
        observable.subscribeOn(Schedulers.io())//IO线程做耗时操作
                .observeOn(AndroidSchedulers.mainThread())//在主线程更新UI
                .subscribe(new Observer<NewsBean>() {//实例化一个观察者
                    //完成
                    @Override
                    public void onCompleted() {
                    }
                    //异常
                    @Override
                    public void onError(Throwable e) {
                    }
                    // 加载中
                    @Override
                    public void onNext(NewsBean newsBean) {
                        list = (ArrayList<NewsBean.SongListBean>) newsBean.getSong_list();
                        //把数据通过这个方法传入P层
                        lisenter.OnFinish(list);
                    }
                });
    }
}

在view下创建IView接口

/**
 * 在View中定义一个接口
 *
 * (定义一个得到数据的方法)
 */

public interface IView {
    //得到P层的网络请求数据
    void getUser(ArrayList<NewsBean.SongListBean> list);
}

在presenter下创建UserPresenter类,建立M和V的关系

/**
 * P层  建立M和V之间的关系
 */

public class UserPresenter implements UserModel.OnFinishLisenter{
    private final IView userView;   //V中的接口
    private final UserModel userModel;//M中的实现类


    //通过有参构造将M中的数据传入V中
    public UserPresenter(IView userView) {
        this.userView = userView;
        this.userModel = new UserModel();//实例化Module
        userModel.setOnUserModel(this);   //这句话重点
    }

    public void getUrl(String url) {
        //得到Model中请求数据的方法
        userModel.getJson(url);
    }

    @Override
    public void OnFinish(ArrayList<NewsBean.SongListBean> list) {
        //把从M层中传过来的数据通过以下的方法传到V层中
        userView.getUser(list);
    }
}

创建adapter文件夹,并创建一个HomeAdapter类 (会报错往下看)

public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{

    private ArrayList<MyChecks> checklist;
    private Context context;
    private List<NewsBean.SongListBean> list;

    public HomeAdapter(ArrayList<MyChecks> checklist, Context context, List<NewsBean.SongListBean> list) {
        this.checklist = checklist;
        this.context = context;
        this.list = list;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
                context).inflate(R.layout.item, parent,
                false));
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position)
    {
        holder.tv.setText(list.get(position).getTitle());
        holder.tv2.setText(list.get(position).getAuthor());
        //用Fresco形式得到的图片
        Uri uri = Uri.parse(list.get(position).getPic_small());
        holder.img.setImageURI(uri);

        //条目的隐藏与显示
        for(int j = 0 ; j < checklist.size();j++){
            if(checklist.get(j).getGone()==0){    //0的时候隐藏
                holder.mycheck.setVisibility(View.GONE);
            }else{
                holder.mycheck.setVisibility(View.VISIBLE);
            }
        }
        //将条目中的框默认为选中状态
        holder.mycheck.setChecked(checklist.get(position).ischeck());
        holder.mycheck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(checklist.get(position).ischeck()==false){
                    checklist.set(position,new MyChecks(true,1));
                }else{
                    checklist.set(position,new MyChecks(false,1));
                }
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount()
    {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder
    {
        TextView tv,tv2;
        //这是用来实现Fresco展示图片的控件
       SimpleDraweeView img;
        //这是复选框
       CheckBox mycheck;

        public MyViewHolder(View view)
        {
            super(view);
            tv = (TextView) view.findViewById(R.id.text);
            tv2 = (TextView) view.findViewById(R.id.text2);
            img = (SimpleDraweeView) view.findViewById(R.id.image);
            mycheck = (CheckBox) view.findViewById(R.id.mycheck);
        }
    }
}

上边的HomeAdapter中我还实现了全选反选的删除和Fresco加载图片,下边就讲一下全选反选+Fresco


一.全选反选

   在bean里创建它的封装类,封装两个参数

public class MyChecks {
    private boolean ischeck;  //用来判断框框的状态
    private int gone = 0;   //用来隐藏显示

    @Override
    public String toString() {
        return "MyChecks{" +
                "ischeck=" + ischeck +
                ", gone=" + gone +
                '}';
    }

    public boolean ischeck() {
        return ischeck;
    }

    public void setIscheck(boolean ischeck) {
        this.ischeck = ischeck;
    }

    public int getGone() {
        return gone;
    }

    public void setGone(int gone) {
        this.gone = gone;
    }

    public MyChecks(boolean ischeck, int gone) {

        this.ischeck = ischeck;
        this.gone = gone;
    }
}

二.Fresco加载图片

     其实我们已经差不多做好了Fresco的基本使用,现在只需要一句话(必须写)

     创建一个MyApp,继承Application


public class MyApp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}


不要忘记在权限里声明MyApp(包名是自己)

        android:name="com.test.app.MyApp"


好了,现在回到主页面,实现IView接口(一定不能忘记写实现IView)

    这里边有Recyclerview和全选反选+删除的实现,其中recyclerview有列表展示的实现和添加线,需要再添加一个工具类,在此就不复述了,可以去参考鸿洋对于recyclerview的详解http://blog.csdn.net/lmj623565791/article/details/45059587

public class MainActivity extends AppCompatActivity implements IView{

    private RecyclerView mRecyclerView;
    UserPresenter userPresenter;    //实例化P层
    HomeAdapter adapter;
    private List<NewsBean.SongListBean> mylist;
    ArrayList<MyChecks> mychecklist;
    private Button checkall;
    private Button btn_bj;
    private Button btn_delete;
    LinearLayout layout;
    boolean ischeckall = false;
    boolean ischeck = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);

        //实例化P层,参数类型是IView
        userPresenter = new UserPresenter(this);
        //判断Fragment在哪一页
        userPresenter.getUrl(API.BASE_URL);//P层中网络请求的方法


        btn_bj = (Button) findViewById(R.id.btn_bj);
        layout = (LinearLayout) findViewById(R.id.caozuolayout);
        layout.setVisibility(View.GONE);
        checkall = (CheckBox) findViewById(R.id.checkall);
        btn_delete = (Button) findViewById(R.id.btn_delete);

        inData();
    }

    public void inData() {
        //显示隐藏编辑
        btn_bj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (ischeckall == true) {
                    btn_bj.setText("编辑");
                    layout.setVisibility(View.GONE);
                    for (int i = 0; i < mychecklist.size(); i++) {
                        mychecklist.set(i, new MyChecks(false, 0));
                    }

                    ischeckall = false;
                } else {
                    btn_bj.setText("完成");
                    layout.setVisibility(View.VISIBLE);


                    for (int i = 0; i < mychecklist.size(); i++) {
                        mychecklist.set(i, new MyChecks(false, 1));
                    }
                    ischeckall = true;
                }
                adapter.notifyDataSetChanged();
            }
        });
        //全选
        checkall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(ischeck == false){
                    for(int i = 0 ; i < mychecklist.size();i++){
                        mychecklist.set(i,new MyChecks(true,1));
                    }
                    ischeck =true;
                }else{
                    for(int i = 0 ; i < mychecklist.size();i++){
                        mychecklist.set(i,new MyChecks(false,1));
                        ischeck =false;
                    }
                }
                adapter.notifyDataSetChanged();
            }
        });
        //删除
        btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ArrayList<NewsBean.SongListBean> deletelist = new ArrayList<NewsBean.SongListBean>();
                ArrayList<MyChecks> deltelist2 = new ArrayList<MyChecks>();
                for(int i = 0 ; i < mylist.size();i++){

                    if(mychecklist.get(i).ischeck()==true){
                        deletelist.add(mylist.get(i));
                        deltelist2.add(mychecklist.get(i));
                    }
                }
                mylist.removeAll(deletelist);
                mychecklist.removeAll(deltelist2);
                if(mylist.size() == 0){
                    btn_bj.setText("编辑");
                    layout.setVisibility(View.GONE);
                    ischeckall = false;
                }
                adapter.notifyDataSetChanged();
            }
        });
    }

    @Override
    public void getUser(ArrayList<NewsBean.SongListBean> list) {
        mychecklist = new ArrayList<>();
        mylist = new ArrayList<>();
        mylist = list;

        for(int i = 0;i < list.size(); i++){
            mychecklist.add(new MyChecks(false,0));
        }

       adapter = new HomeAdapter(mychecklist,MainActivity.this,list);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        mRecyclerView.setAdapter(adapter);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值