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

来源:互联网 发布:二手东西交易软件 编辑:程序博客网 时间:2024/06/06 05:29

效果图



我们先导入依赖

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