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); }}
阅读全文
0 0
- MVP+Retrofit网络请求和添加拦截器+Fresco+全选反选与删除
- MVP+Fresco+RXJava+Retrofit+全选+反选
- MVP实现用Retrofit请求网络数据Fresco加载图片,Recyclerview CheckBox显示并实现全选删除
- MVP+Rxjava+Retrofit+Fresco网络请求数据
- mvp,retrofit请求;listview,fresco展示图片
- 添加删除 全选 反选 删除 排序
- 利用jQuery实现全选、反选、删除和添加
- 使用JQuery实现全选、反选、添加和删除功能
- MVP+OKhttp,拦截器+Rxjava+RecyclerView 全选反选,隐藏,显示切换标题
- 使用MVP+Retrofit+RxJava 图片加载使用Fresco 做网络请求并展示数据
- 购物车,全选,反选,删除,添加
- MVP+Retrofit封装网络请求
- fragment联动与RecycleView请求数据(包含retrofit,Fresco,EventBus与GreenDao结合MVP)
- Retrofit+RxJava+Fresco+MVP
- Retrofit+RxJava+Fresco+MVP
- Retrofit网络请求和MVP的简单的讲解
- 全选+删除+网络请求
- MVP+rxJava+retrofit+拦截器
- phpstorm快捷键(图解版)
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
- 并查集详解+模板
- 最多拦截导弹数 NBUT
- - Five Dimensional Points(暴力)
- MVP+Retrofit网络请求和添加拦截器+Fresco+全选反选与删除
- 降维方法PCA
- OkHttp封装+网络拦截器
- struts之采用xml的方式来对表单当中的数据进行过滤操作
- 骑士走棋盘(c/python)
- Linux学习(二十八):数据库sqlite3
- 计蒜客 最大子阵
- Lua基础之table(表)
- 图片框架 三重加载