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