您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-06 20:33 363 查看
效果图








我们先导入依赖 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下创建IVi
4000
ew接口
/**
* 在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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: