MVP模式实现网络请求数据并添加到列表(Rxjava+Retrofit)

使用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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值