MVP操作RecyclerView多条目SpringView,OKHttp封装请求网络
2017-11-10 21:21
465 查看
build.gradle导入依赖
activity_main的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.liaoinstan.springview.widget.SpringView
android:id="@+id/spring_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</com.liaoinstan.springview.widget.SpringView>
</RelativeLayout>MainActivity 实现
view层的接口,成功的回调方法里 去给适配器设置集合数据
presenter层,在调用model层访问数据
public class MutiPresenter {
MutiModel mutiModel = new MutiModel();
MutiViewCallBack mutiviewCallBack;
public MutiPresenter(MutiViewCallBack mutiviewCallBack) {
this.mutiviewCallBack = mutiviewCallBack;
}
//view层调用p这个方法 p层再去model层访问数据
public void onRefresh(boolean shuaxin){
mutiModel.Refresh(shuaxin, new MutiModel.ModelCallBack() {
@Override
public void modelsuccess(MutiBean bean) {
mutiviewCallBack.success(bean);
}
@Override
public void modelfailure(Exception e) {
mutiviewCallBack.failure(e);
}
});
}
}
model层里面调用okhttp封装类,访问网络数据,成功的回调中携带bean类,bean类型改成提前写好的bean类
public class MutiModel {
//model层里面访问网络数据,调用okhttp
public void Refresh(boolean shuaxin, final ModelCallBack modelCallBack) {
//这里面 使用okhttp 封装好的方法请求数据
//http://v.juhe.cn/toutiao/index?type=&key=fac0f16b2ab153b436517271e78408ad
//http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653
OkhttpUtils.getInstance().asyn(null, "http://v.juhe.cn/toutiao/index?type=&key=fac0f16b2ab153b436517271e78408ad", new AbstractUiCallBack<MutiBean>() {
@Override
//封装好的okhttputils类里面实现的接口
public void success(MutiBean mutiBean) {
modelCallBack.modelsuccess(mutiBean);
}
@Override
public void failure(Exception e) {
modelCallBack.modelfailure(e);
}
});
}
//model的接口
public interface ModelCallBack{
public void modelsuccess(MutiBean bean);
public void modelfailure(Exception e);
}
}
这时Mainactivity的成功的回调方法里面有了 bean的数据,将集合传给adapter,设置recyclerview显示
public class MutiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Context context;
public MutiAdapter(Context context){
this.context = context;
}
//先定义一个装数据的集合,一开始是空的,调用adddata方法时候集合才有数据
private List<MutiBean.ResultBean.DataBean> listda;
public void addData(List<MutiBean.ResultBean.DataBean> list){
//list是传来的集合,里面有请求到的数据
if(listda==null){
//如果不存在这个集合 就创建一个
listda = new ArrayList<>();
}
//将传来的集合 添加进去
listda.addAll(list);
//刷新适配器
notifyDataSetChanged();
}
@Override
//创建viewholder 的
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据 不同的类型 创建不同的viewholder
if(viewType == 0){
//一张图片
View view1 = View.inflate(context, R.layout.muti_item1,null);
ViewHolder1 viewHolder1 = new ViewHolder1(view1);
return viewHolder1;
}else if (viewType==1){
//两张图片
View view2 = View.inflate(context,R.layout.muti_item2,null);
ViewHolder2 viewHolder2 = new ViewHolder2(view2);
return viewHolder2;
}else{
View view3 = View.inflate(context,R.layout.muti_item3,null);
ViewHolder3 viewHolder3 = new ViewHolder3(view3);
return viewHolder3;
}
}
@Override
//显示图片的 判断viewholder的不同,设置控件的值
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//判断viewholder
if(holder instanceof ViewHolder1){
ViewHolder1 holder1 = (ViewHolder1) holder;
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s(),holder1.item1_image);
}else if (holder instanceof ViewHolder2){
ViewHolder2 holder2 = (ViewHolder2) holder;
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s(),holder2.item2_image1);
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s02(),holder2.item2_image2);
}else{
ViewHolder3 holder3 = (ViewHolder3) holder;
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s(),holder3.item3_image1);
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s02(),holder3.item3_image2);
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s03(),holder3.item3_image3);
}
}
@Override
public int getItemViewType(int position) {
//返回条目类型的数量,3种条目 返回0,1,2
//判断是哪种条目类型
if(!TextUtils.isEmpty(listda.get(position).getThumbnail_pic_s03())){
return 2;
}else if(!TextUtils.isEmpty(listda.get(position).getThumbnail_pic_s02())){
return 1;
}else{
return 0;
}
}
@Override
public int getItemCount() {
return listda==null?0:listda.size();//返回的条目的数量
}
//自己写的三个viewholder,获取控件的id
public static class ViewHolder1 extends RecyclerView.ViewHolder {
private final ImageView item1_image;
public ViewHolder1(View itemView) {
super(itemView);
//一张图片的
item1_image = (ImageView) itemView.findViewById(R.id.item1_image);
}
}
public static class ViewHolder2 extends RecyclerView.ViewHolder {
private final ImageView item2_image1;
private final ImageView item2_image2;
public ViewHolder2(View itemView) {
super(itemView);
item2_image1 = (ImageView) itemView.findViewById(R.id.item2_image1);
item2_image2 = (ImageView) itemView.findViewById(R.id.item2_image2);
}
}
public static class ViewHolder3 extends RecyclerView.ViewHolder {
private final ImageView item3_image1;
private final ImageView item3_image2;
private final ImageView item3_image3;
public ViewHolder3(View itemView) {
super(itemView);
item3_image1 = (ImageView) itemView.findViewById(R.id.item3_image1);
item3_image2 = (ImageView) itemView.findViewById(R.id.item3_image2);
item3_image3 = (ImageView) itemView.findViewById(R.id.item3_image3);
}
}
}
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.1" defaultConfig { applicationId "com.example.lianxiday10_myp_recyclerview" minSdkVersion 18 targetSdkVersion 25 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.+' compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.google.code.gson:gson:2.8.2' compile 'com.liaoinstan.springview:library:1.3.0' }
activity_main的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.liaoinstan.springview.widget.SpringView
android:id="@+id/spring_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</com.liaoinstan.springview.widget.SpringView>
</RelativeLayout>MainActivity 实现
view层的接口,成功的回调方法里 去给适配器设置集合数据
public class MainActivity extends AppCompatActivity implements MutiViewCallBack{ private SpringView springView; private RecyclerView recyclerView; private MutiAdapter mutiAdapter; private MutiPresenter mutiPresenter; //mvp 展示recycleview 多条目 上拉下拉 使用okhttp封装请求数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取id springView = (SpringView) findViewById(R.id.spring_view); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); //new适配器,将上下文传过去 mutiAdapter = new MutiAdapter(this); //new出来presenter mutiPresenter = new MutiPresenter(this); //设置布局类型 false是正序 LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false); //设置布局管理器 recyclerView.setLayoutManager(manager); recyclerView.setAdapter(mutiAdapter); //springview的设置 springView.setHeader(new DefaultHeader(this)); springView.setFooter(new DefaultFooter(this)); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { //下拉刷新 mutiPresenter.onRefresh(true); } @Override public void onLoadmore() { //上拉加载 mutiPresenter.onRefresh(false); } }); //进入页面先访问数据 mutiPresenter.onRefresh(true); } //实现MutiViewCallBack @Override public void success(MutiBean mutibean) { //这个回调是mutiview的 presenter请求到数据的成功回调 if(springView !=null){ //刷新完成的方法 springView.onFinishFreshAndLoad(); } //进入页面给适配器传数据 mutiAdapter.addData(mutibean.getResult().getData()); } @Override public void failure(Exception e) { Toast.makeText(this,"error",Toast.LENGTH_SHORT).show(); } }view层的接口
public interface MutiViewCallBack { public void success(MutiBean mutibean);//这个方法接收到访问网络传回的数据 public void failure(Exception e); }
presenter层,在调用model层访问数据
public class MutiPresenter {
MutiModel mutiModel = new MutiModel();
MutiViewCallBack mutiviewCallBack;
public MutiPresenter(MutiViewCallBack mutiviewCallBack) {
this.mutiviewCallBack = mutiviewCallBack;
}
//view层调用p这个方法 p层再去model层访问数据
public void onRefresh(boolean shuaxin){
mutiModel.Refresh(shuaxin, new MutiModel.ModelCallBack() {
@Override
public void modelsuccess(MutiBean bean) {
mutiviewCallBack.success(bean);
}
@Override
public void modelfailure(Exception e) {
mutiviewCallBack.failure(e);
}
});
}
}
model层里面调用okhttp封装类,访问网络数据,成功的回调中携带bean类,bean类型改成提前写好的bean类
public class MutiModel {
//model层里面访问网络数据,调用okhttp
public void Refresh(boolean shuaxin, final ModelCallBack modelCallBack) {
//这里面 使用okhttp 封装好的方法请求数据
//http://v.juhe.cn/toutiao/index?type=&key=fac0f16b2ab153b436517271e78408ad
//http://v.juhe.cn/toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653
OkhttpUtils.getInstance().asyn(null, "http://v.juhe.cn/toutiao/index?type=&key=fac0f16b2ab153b436517271e78408ad", new AbstractUiCallBack<MutiBean>() {
@Override
//封装好的okhttputils类里面实现的接口
public void success(MutiBean mutiBean) {
modelCallBack.modelsuccess(mutiBean);
}
@Override
public void failure(Exception e) {
modelCallBack.modelfailure(e);
}
});
}
//model的接口
public interface ModelCallBack{
public void modelsuccess(MutiBean bean);
public void modelfailure(Exception e);
}
}
这时Mainactivity的成功的回调方法里面有了 bean的数据,将集合传给adapter,设置recyclerview显示
public class MutiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Context context;
public MutiAdapter(Context context){
this.context = context;
}
//先定义一个装数据的集合,一开始是空的,调用adddata方法时候集合才有数据
private List<MutiBean.ResultBean.DataBean> listda;
public void addData(List<MutiBean.ResultBean.DataBean> list){
//list是传来的集合,里面有请求到的数据
if(listda==null){
//如果不存在这个集合 就创建一个
listda = new ArrayList<>();
}
//将传来的集合 添加进去
listda.addAll(list);
//刷新适配器
notifyDataSetChanged();
}
@Override
//创建viewholder 的
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//根据 不同的类型 创建不同的viewholder
if(viewType == 0){
//一张图片
View view1 = View.inflate(context, R.layout.muti_item1,null);
ViewHolder1 viewHolder1 = new ViewHolder1(view1);
return viewHolder1;
}else if (viewType==1){
//两张图片
View view2 = View.inflate(context,R.layout.muti_item2,null);
ViewHolder2 viewHolder2 = new ViewHolder2(view2);
return viewHolder2;
}else{
View view3 = View.inflate(context,R.layout.muti_item3,null);
ViewHolder3 viewHolder3 = new ViewHolder3(view3);
return viewHolder3;
}
}
@Override
//显示图片的 判断viewholder的不同,设置控件的值
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//判断viewholder
if(holder instanceof ViewHolder1){
ViewHolder1 holder1 = (ViewHolder1) holder;
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s(),holder1.item1_image);
}else if (holder instanceof ViewHolder2){
ViewHolder2 holder2 = (ViewHolder2) holder;
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s(),holder2.item2_image1);
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s02(),holder2.item2_image2);
}else{
ViewHolder3 holder3 = (ViewHolder3) holder;
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s(),holder3.item3_image1);
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s02(),holder3.item3_image2);
ImageLoader.getInstance().displayImage(listda.get(position).getThumbnail_pic_s03(),holder3.item3_image3);
}
}
@Override
public int getItemViewType(int position) {
//返回条目类型的数量,3种条目 返回0,1,2
//判断是哪种条目类型
if(!TextUtils.isEmpty(listda.get(position).getThumbnail_pic_s03())){
return 2;
}else if(!TextUtils.isEmpty(listda.get(position).getThumbnail_pic_s02())){
return 1;
}else{
return 0;
}
}
@Override
public int getItemCount() {
return listda==null?0:listda.size();//返回的条目的数量
}
//自己写的三个viewholder,获取控件的id
public static class ViewHolder1 extends RecyclerView.ViewHolder {
private final ImageView item1_image;
public ViewHolder1(View itemView) {
super(itemView);
//一张图片的
item1_image = (ImageView) itemView.findViewById(R.id.item1_image);
}
}
public static class ViewHolder2 extends RecyclerView.ViewHolder {
private final ImageView item2_image1;
private final ImageView item2_image2;
public ViewHolder2(View itemView) {
super(itemView);
item2_image1 = (ImageView) itemView.findViewById(R.id.item2_image1);
item2_image2 = (ImageView) itemView.findViewById(R.id.item2_image2);
}
}
public static class ViewHolder3 extends RecyclerView.ViewHolder {
private final ImageView item3_image1;
private final ImageView item3_image2;
private final ImageView item3_image3;
public ViewHolder3(View itemView) {
super(itemView);
item3_image1 = (ImageView) itemView.findViewById(R.id.item3_image1);
item3_image2 = (ImageView) itemView.findViewById(R.id.item3_image2);
item3_image3 = (ImageView) itemView.findViewById(R.id.item3_image3);
}
}
}
相关文章推荐
- 使用MVP,OKHttp封装类及其拦截器,RecyclerView,SpringView,ImageLoader实现数据的多条目加载
- MVP+Retrofit+RxJava请求网络数据实现RecyclerView多条目展示
- 网络请求数据添加到列表(okhttp+RecyclerView)
- RecyclerView条目跳转+SpringView数据刷新加载+MVP+OKhttp+拦截器+自定义view 实现请求网络数据的二级列表购物车
- 使用MVP注册登录模块+封装的OKhttp,拦截器+QQ第三方登录+RecyclerView+SpringView上拉加载下拉刷新网络数据
- Android_OkHttp+Picasso+RecyclerView实现网络图片下载瀑布流
- MVP实现用Retrofit请求网络数据Fresco加载图片,Recyclerview CheckBox显示并实现全选删除
- MVP架构分包+OkHttp网络请求+RecyclerView展示数据
- MVP模式的OKhttp请求网络数据,xrecyclerview上拉刷新,下拉加载
- Android实际开发之网络请求组件的封装(OkHttp为核心)
- Android----------OkHttp网络请求框架Get和Post简单封装(泛型)
- recyclerview,okHttp,布局切换,springView上拉刷新下拉加载
- Retrofit,OkHttp拦截器,RxJava封装请求网络
- 封装Retrofit,RXJAVA,okhttp网络请求的工具
- 调用OKhttp封装类请求网络数据适配到Recyclerview上拉下拉刷新
- android网络请求组件(一)OkHttp3的封装使用
- 网络请求封装及使用(okhttp)
- mvp,okhttp,recyclerview
- RecyclerView多条目加载(网络请求数据)
- 实战MVP请求数据OKHttp封装RecyclerView上拉刷新下拉加载