MVP模式实现网络请求数据并添加到列表(Rxjava+Retrofit)
来源:互联网 发布:ajax跨域请求json数据 编辑:程序博客网 时间:2024/05/21 13:54
使用MVP模式实现网络请求数据并添加到列表,网络请求数据使用的是RXjava和Retrofit
我在代码中添加了recyclerview和fragment来实现页面滑动
首先是导入依赖
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:recyclerview-v7:21.0.0'
添加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>自己封装一个bean类NewsBean
Model层IModel
public interface IModel { void getUrl(String url);}UserModel
public class UserModel implements IModel { ArrayList<NewsBean.NewslistBean> list; private OnFinish onFinish; public interface OnFinish{ void OnFinishListener(ArrayList<NewsBean.NewslistBean> list); } public void setOnFinish(OnFinish onFinish) { this.onFinish = onFinish; } @Override public void getUrl(String url) { list=new ArrayList<>(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); // 通过动态代理获得网络接口的数据 ApiService apiService = retrofit.create(ApiService.class); Observable<NewsBean> getnews = apiService.getnews(); // 设置请求数据时候的线程 getnews.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<NewsBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Log.d("error","=============="); } @Override public void onNext(NewsBean newsBean) { list= (ArrayList<NewsBean.NewslistBean>) newsBean.getNewslist(); onFinish.OnFinishListener(list); } }); }}P层UserPresenter
public class UserPresenter implements UserModel.OnFinish { private final IView userView; private final UserModel usermodel; public UserPresenter(IView userView) { this.userView = userView; this.usermodel=new UserModel(); usermodel.setOnFinish(this); } public void getUser(String url){ usermodel.getUrl(url); } @Override public void OnFinishListener(ArrayList<NewsBean.NewslistBean> list) { userView.getNews(list); }}
V层IView
public interface IView { void getNews(ArrayList<NewsBean.NewslistBean> list);}Xinwen
public class Xinwen extends Fragment implements IView{ private List<String> list = new ArrayList<String>(); private int flag; RecyclerView news_recyclerview; RecyAdapter adapter; List<NewsBean.NewslistBean> lists; private UserPresenter userPresenter; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Bundle bundle = this.getArguments(); if(bundle != null){ list = bundle.getStringArrayList("content"); flag = bundle.getInt("flag"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.fm_test, container,false); initView(view); // 自己写的方法 配置请求下来的数据 initData(flag); return view; } private void initData(int flag) { Retrofit retrofit = new Retrofit.Builder() .baseUrl(list.get(flag)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); // 通过动态代理获得网络接口的数据 ApiService apiService = retrofit.create(ApiService.class); Observable<NewsBean> getnews = apiService.getnews(); // 设置请求数据时候的线程 getnews.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<NewsBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(NewsBean newsBean) { lists=newsBean.getNewslist(); news_recyclerview.setAdapter(adapter = new RecyAdapter(getActivity(),lists)); } }); } public void initView(View view){ news_recyclerview = (RecyclerView) view.findViewById(R.id.id_recyclerview); lists = new ArrayList<>(); news_recyclerview.setLayoutManager(new LinearLayoutManager(getActivity())); userPresenter = new UserPresenter(this); userPresenter.getUser(list.get(flag)); } public static Xinwen newInstance(List<String> contentList,int flag){ Bundle bundle = new Bundle(); bundle.putStringArrayList("content", (ArrayList<String>) contentList); bundle.putInt("flag", flag); Xinwen testFm = new Xinwen(); testFm.setArguments(bundle); return testFm; } @Override public void getNews(ArrayList<NewsBean.NewslistBean> list) { news_recyclerview.setAdapter(adapter = new RecyAdapter(getActivity(),lists)); }}
RecyclerView的适配器RecyAdapter
public class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.MyViewHolder> { // 上下文 Context context; // 数据源 List<NewsBean.NewslistBean> lists; public RecyAdapter(Context context, List<NewsBean.NewslistBean> lists) { this.context = context; this.lists = lists; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recy_item, parent, false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv.setText(lists.get(position).getTitle()); Uri uri = Uri.parse(lists.get(position).getPicUrl()); holder.img.setImageURI(uri); } @Override public int getItemCount() { return lists.size(); } class MyViewHolder extends ViewHolder { TextView tv; SimpleDraweeView img; public MyViewHolder(View view) { super(view); tv = (TextView) view.findViewById(R.id.recy_item_title); img = (SimpleDraweeView) view.findViewById(R.id.recy_item_img); } }}Api
//一些测试接口public static final String ONE_PATH="http://api.tianapi.com/tiyu/";public static final String TWO_PATH="http://api.tianapi.com/apple/";public static final String THREE_PATH="https://api.tianapi.com/nba/";public static final String FROE_PATH="https://api.tianapi.com/huabian/";public static final String FIVE_PATH="https://api.tianapi.com/football/";public static final String SIX_PATH="https://api.tianapi.com/keji/";ApiService
@GET("?key=e539283e9a1d63f915398bd38b12c38a&num=10")Observable<NewsBean> getnews();
//横向滚动条的适配器FragmentVPAdapter
public class FragmentVPAdapter extends FragmentPagerAdapter { private ArrayList<Xinwen> fragments; private FragmentManager fm; public FragmentVPAdapter(FragmentManager fm, ArrayList<Xinwen> fragments) { super(fm); this.fm = fm; this.fragments = fragments; } public void setFragments(ArrayList<Xinwen> fragments) { if(this.fragments != null){ FragmentTransaction ft = fm.beginTransaction(); for(Fragment f:this.fragments){ ft.remove(f); } ft.commit(); ft=null; fm.executePendingTransactions(); } this.fragments = fragments; notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public Fragment getItem(int arg0) { return fragments.get(arg0); } @Override public int getCount() { return fragments.size(); }}MyApp(记得要在清单文件中配置)
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); }}
主类(显示viewpager和HorizontalScrollView )public class News extends Fragment{ private List<String> titleList = new ArrayList<String>(); //标题链表 private List<String> contentList = new ArrayList<String>(); //内容链表 private List<Xinwen> fragmentList = new ArrayList<Xinwen>(); //碎片链表 private int screenWidth; //屏幕宽度 private ViewPager vp; private HorizontalScrollView scrollView; private List<TextView> textViews = new ArrayList<TextView>(); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.item_news, null); initList(); //初始化内容和标题 //获取屏幕宽度 WindowManager windowManager = getActivity().getWindowManager(); Display display = windowManager.getDefaultDisplay(); screenWidth = display.getWidth(); vp = (ViewPager)view.findViewById(R.id.viewPager); scrollView = (HorizontalScrollView)view.findViewById(R.id.scrollView); //有多少个标题就有多少个碎片,动态添加 for(int i=0;i<titleList.size();i++){ Xinwen testFm = new Xinwen().newInstance(contentList, i); fragmentList.add(testFm); } //初始化导航栏布局 LinearLayout navigationLl = new LinearLayout(getActivity()); LinearLayout.LayoutParams mParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); navigationLl.setLayoutParams(mParams); navigationLl.setOrientation(LinearLayout.HORIZONTAL); navigationLl.setBackgroundColor(Color.GREEN); //往导航栏添加标题 if(titleList.size() <= 3){ //标题栏小于4个时,平分屏幕宽度 LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); params.weight = 1; for (int i = 0; i < titleList.size(); i++) { final TextView tv = new TextView(getActivity()); tv.setText(titleList.get(i)); tv.setGravity(Gravity.CENTER); final int finalI = i; tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { tv.setTextColor(Color.RED); vp.setCurrentItem(finalI); } }); textViews.add(tv); navigationLl.addView(tv, params); //往导航栏添加标题 } } if(titleList.size() > 3){ //标题大于四个,重新规划textView大小 LinearLayout.LayoutParams params1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); params1.width = 100; params1.height = LayoutParams.MATCH_PARENT; for (int i = 0; i < titleList.size(); i++) { final TextView tv = new TextView(getActivity()); tv.setText(titleList.get(i)); tv.setGravity(Gravity.CENTER); final int finalI = i; tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { tv.setTextColor(Color.RED); vp.setCurrentItem(finalI); } }); textViews.add(tv); navigationLl.addView(tv, params1); } } //第一个标题默认红色 if (textViews != null && textViews.size() > 0) { textViews.get(0).setTextColor(Color.RED); } scrollView.addView(navigationLl); //往scrollView添加导航栏 vp.setAdapter(new FragmentVPAdapter(getFragmentManager(), (ArrayList<Xinwen>) fragmentList)); vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { setSelect(position); if(position>=4){ scrollView.scrollBy((int) (0.25*screenWidth), 0); }else if(position<4){ scrollView.scrollBy(-(int) (0.25*screenWidth), 0); } } @Override public void onPageScrollStateChanged(int state) { } }); return view; } public void setSelect(int position) { vp.setCurrentItem(position); for (int i = 0; i < textViews.size(); i++) { textViews.get(i).setTextColor(Color.BLACK); } textViews.get(position).setTextColor(Color.RED); } public void initList(){ //添加标题 titleList.add("标题一"); titleList.add("标题二"); titleList.add("标题三"); titleList.add("标题四"); titleList.add("标题五"); titleList.add("标题六"); //添加内容 contentList.add(Api.ONE_PATH); contentList.add(Api.TWO_PATH); contentList.add(Api.THREE_PATH); contentList.add(Api.FROE_PATH); contentList.add(Api.FIVE_PATH); contentList.add(Api.SIX_PATH); }}
布局文件
item_news
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <HorizontalScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="50dp" android:fillViewport="true" android:scrollbars="none" > </HorizontalScrollView> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager></LinearLayout>fm_test
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/id_recyclerview" android:dividerHeight="10dp" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
recy_item
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/recy_item_img" android:layout_width="100dp" android:layout_height="100dp" fresco:placeholderImage="@mipmap/ic_launcher" /> <TextView android:id="@+id/recy_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
阅读全文
0 0
- MVP模式实现网络请求数据并添加到列表(Rxjava+Retrofit)
- MVP+Rxjava+Retrofit+Fresco网络请求数据
- MVP(Retrofit+RXJava)实现网络请求
- Android MVP框架+RxJava+Retrofit+cecycleView,请求网络数据并加载
- 使用MVP+Retrofit+RxJava 图片加载使用Fresco 做网络请求并展示数据
- 简单的MVP+Retrofit+RxJava请求网络数据(一)
- MVP框架使用Retrofit+Rxjava请求网络数据
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式
- MVP+Retrofit+RxJava请求网络数据实现RecyclerView多条目展示
- 使用MVP+Retrofit+RxJava实现的的Android Demo (下)使用Retrofit+RxJava处理网络请求
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- android+MVP+Retrofit+RxJava做网络请求
- 使用rxjava,retrofit,okhttp实现mvp模式的数据解析
- MVP+Rxjava+Okhttp+Retrofit+XRecyclerview请求数据
- MVP +Retrofit +Rxjava 请求
- Rxjava观察者模式+Retrofit请求GSON数据+Fresco处理图片+Xrecyclerview展示数据+MVP模式
- Python和和其他语言的对比
- 如何验证成为微信开发者
- easyui 防止页面加载出现dialog等其他非主页信息
- const的指针和引用
- 输入任意一个整数,编程判断这个数的奇偶性。
- MVP模式实现网络请求数据并添加到列表(Rxjava+Retrofit)
- javascript之杂七杂八
- ex2_6 排列
- Java 基本数据类型扩充
- 机器学习基石-08-2-Error Measure
- Rhyme/Intellij idea 工作窗口切换快捷键,摆脱鼠标的束缚
- cocos2dx渲染机制
- 程序员
- HTML5调用摄像头+视频特效+录制视频+录音+截图+变声+滤波+音频可视化