mvp+okhttp+recyclerview

来源:互联网 发布:淘宝活动报名入口 编辑:程序博客网 时间:2024/05/17 08:33

首先要导入以下依赖:

  //    //上下拉刷新
    //    //替换findviewbyid
    //
//
    //
//    //添加recycleview 分割线
    //
//    //图片加载框架  或者使用ImageLoader
   

    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
    compile 'com.liaoinstan.springview:library:1.3.0'
    compile 'com.jakewharton:butterknife:8.8.1'
    compile 'com.google.code.gson:gson:2.8.1'
    compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'
    compile 'com.github.bumptech.glide:glide:4.2.0'
    testCompile 'junit:junit:4.12'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.2.0'

接着在总的项目工程里的allprojects加入
maven { url 'https://maven.google.com' }

接下来就开始写我们的布局

登录界面:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="muhanxi.myapplication.LoginActivity">


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/username"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/login"
        android:text="login"/>


</LinearLayout>
主页面  里面有recyclerview和下拉刷新动画:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="muhanxi.myapplication.MainActivity">


    <com.liaoinstan.springview.widget.SpringView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/springview">

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/recycleview"/>

    </com.liaoinstan.springview.widget.SpringView>



</LinearLayout>

还有适配布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <ImageView
        android:scaleType="centerCrop"
        android:id="@+id/adapter_imageview"
        android:layout_width="wrap_content"
        android:layout_height="100dp" />

</LinearLayout>

mainActivity类:
package muhanxi.myapplication;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.LinearLayout;

import com.liaoinstan.springview.container.DefaultFooter;
import com.liaoinstan.springview.container.DefaultHeader;
import com.liaoinstan.springview.container.MeituanFooter;
import com.liaoinstan.springview.container.MeituanHeader;
import com.liaoinstan.springview.widget.SpringView;
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;

import butterknife.BindView;
import butterknife.ButterKnife;
import muhanxi.myapplication.bean.Bean;
import muhanxi.myapplication.presenter.MainActivityPresenter;
import muhanxi.myapplication.view.MainActivityViewListener;


/**
 * okhttp + recycleview + mvp
 * login + mvp
 * mvp
 *  activity  充当View
 *  presenter
 *  Model +
 */


public class MainActivity extends Activity implements MainActivityViewListener{

    @BindView(R.id.recycleview)
    RecyclerView recycleview;
    @BindView(R.id.springview)
    SpringView springview;
    private MainActivityPresenter presenter;
    private IAdapter adapter;
    private StaggeredGridLayoutManager manager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);



        springview.setHeader(new MeituanHeader(this));
        springview.setFooter(new MeituanFooter(this));

        presenter = new MainActivityPresenter(this);


        manager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
        recycleview.setLayoutManager(manager);


        adapter = new IAdapter(this);

        recycleview.setAdapter(adapter);

        HorizontalDividerItemDecoration  horizontalDividerItemDecoration =  new HorizontalDividerItemDecoration.Builder(this)
                .color(Color.RED)
//                .sizeResId(R.dimen.divider)
//                .marginResId(R.dimen.leftmargin, R.dimen.rightmargin)
                .build() ;
        //分割线
        recycleview.addItemDecoration(horizontalDividerItemDecoration);

        presenter.getData(true);


        springview.setListener(new SpringView.OnFreshListener() {
            @Override
            public void onRefresh() {

                presenter.getData(true);



            }

            @Override
            public void onLoadmore() {
                presenter.getData(true);

            }
        });

    }

    @Override
    public void callBackSuccess(final Bean bean) {


        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                adapter.setData(bean);
                springview.onFinishFreshAndLoad();

            }
        });



    }

    @Override
    public void callBackFailure(int code) {

    }
}
登录activity:
package muhanxi.myapplication;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.LinearLayout;

import com.liaoinstan.springview.container.DefaultFooter;
import com.liaoinstan.springview.container.DefaultHeader;
import com.liaoinstan.springview.container.MeituanFooter;
import com.liaoinstan.springview.container.MeituanHeader;
import com.liaoinstan.springview.widget.SpringView;
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;

import butterknife.BindView;
import butterknife.ButterKnife;
import muhanxi.myapplication.bean.Bean;
import muhanxi.myapplication.presenter.MainActivityPresenter;
import muhanxi.myapplication.view.MainActivityViewListener;


/**
 * okhttp + recycleview + mvp
 * login + mvp
 * mvp
 *  activity  充当View
 *  presenter
 *  Model +
 */


public class MainActivity extends Activity implements MainActivityViewListener{

    @BindView(R.id.recycleview)
    RecyclerView recycleview;
    @BindView(R.id.springview)
    SpringView springview;
    private MainActivityPresenter presenter;
    private IAdapter adapter;
    private StaggeredGridLayoutManager manager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);



        springview.setHeader(new MeituanHeader(this));
        springview.setFooter(new MeituanFooter(this));

        presenter = new MainActivityPresenter(this);


        manager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
        recycleview.setLayoutManager(manager);


        adapter = new IAdapter(this);

        recycleview.setAdapter(adapter);

        HorizontalDividerItemDecoration  horizontalDividerItemDecoration =  new HorizontalDividerItemDecoration.Builder(this)
                .color(Color.RED)
//                .sizeResId(R.dimen.divider)
//                .marginResId(R.dimen.leftmargin, R.dimen.rightmargin)
                .build() ;
        //分割线
        recycleview.addItemDecoration(horizontalDividerItemDecoration);

        presenter.getData(true);


        springview.setListener(new SpringView.OnFreshListener() {
            @Override
            public void onRefresh() {

                presenter.getData(true);



            }

            @Override
            public void onLoadmore() {
                presenter.getData(true);

            }
        });

    }

    @Override
    public void callBackSuccess(final Bean bean) {


        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                adapter.setData(bean);
                springview.onFinishFreshAndLoad();

            }
        });



    }

    @Override
    public void callBackFailure(int code) {

    }
}
recyclerview 适配器类:
package muhanxi.myapplication;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.LinearLayout;

import com.liaoinstan.springview.container.DefaultFooter;
import com.liaoinstan.springview.container.DefaultHeader;
import com.liaoinstan.springview.container.MeituanFooter;
import com.liaoinstan.springview.container.MeituanHeader;
import com.liaoinstan.springview.widget.SpringView;
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;

import butterknife.BindView;
import butterknife.ButterKnife;
import muhanxi.myapplication.bean.Bean;
import muhanxi.myapplication.presenter.MainActivityPresenter;
import muhanxi.myapplication.view.MainActivityViewListener;


/**
 * okhttp + recycleview + mvp
 * login + mvp
 * mvp
 *  activity  充当View
 *  presenter
 *  Model +
 */


public class MainActivity extends Activity implements MainActivityViewListener{

    @BindView(R.id.recycleview)
    RecyclerView recycleview;
    @BindView(R.id.springview)
    SpringView springview;
    private MainActivityPresenter presenter;
    private IAdapter adapter;
    private StaggeredGridLayoutManager manager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);



        springview.setHeader(new MeituanHeader(this));
        springview.setFooter(new MeituanFooter(this));

        presenter = new MainActivityPresenter(this);


        manager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
        recycleview.setLayoutManager(manager);


        adapter = new IAdapter(this);

        recycleview.setAdapter(adapter);

        HorizontalDividerItemDecoration  horizontalDividerItemDecoration =  new HorizontalDividerItemDecoration.Builder(this)
                .color(Color.RED)
//                .sizeResId(R.dimen.divider)
//                .marginResId(R.dimen.leftmargin, R.dimen.rightmargin)
                .build() ;
        //分割线
        recycleview.addItemDecoration(horizontalDividerItemDecoration);

        presenter.getData(true);


        springview.setListener(new SpringView.OnFreshListener() {
            @Override
            public void onRefresh() {

                presenter.getData(true);



            }

            @Override
            public void onLoadmore() {
                presenter.getData(true);

            }
        });

    }

    @Override
    public void callBackSuccess(final Bean bean) {


        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                adapter.setData(bean);
                springview.onFinishFreshAndLoad();

            }
        });



    }

    @Override
    public void callBackFailure(int code) {

    }
}

登录的M层

package muhanxi.myapplication.model;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by muhanxi on 17/10/14.
 */

public class LoginActivityModel {

    public void login(String username, String password,final LoginActivityModelListener listener) {


        OkHttpClient okHttpClient = new OkHttpClient();

        final Request request = new Request.Builder().url("").build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                listener.onfailed();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                listener.success(response.body().string());
            }
        });


    }

}


登录的接口:
package muhanxi.myapplication.model;

/**
 * Created by muhanxi on 17/10/14.
 */

public interface LoginActivityModelListener {

    public void success(Object object);
    public void onfailed();


}

mainactivity的M层:

package muhanxi.myapplication.model;

import com.google.gson.Gson;

import java.io.IOException;

import muhanxi.myapplication.bean.Bean;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by muhanxi on 17/10/14.
 */

public class MainActivityModel {



    public void getData(boolean up,final MainActivityModelListener listener){


        OkHttpClient client = new OkHttpClient();

        final Request request = new Request.Builder().url("http://qhb.2dyt.com/Bwei/news?type=9&postkey=109rff1d1AK").build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 1 网络
                listener.callBackFailure(1);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                String result = response.body().string();


                Gson gson = new Gson();
                Bean bean =  gson.fromJson(result, Bean.class);

                listener.callBackSuccess(bean);


            }
        });


    }





}

MainActivity的接口:

package muhanxi.myapplication.model;

import muhanxi.myapplication.bean.Bean;

/**
 * Created by muhanxi on 17/10/14.
 */

public interface MainActivityModelListener {


    public void callBackSuccess(Bean bean);
    public void callBackFailure(int code);


}

登录的P层:
package muhanxi.myapplication.presenter;

import muhanxi.myapplication.model.LoginActivityModel;
import muhanxi.myapplication.model.LoginActivityModelListener;
import muhanxi.myapplication.view.LoginActivityViewListener;

/**
 * Created by muhanxi on 17/10/14.
 */

public class LoginActivityPresenter {


    private LoginActivityViewListener listener ;
    private LoginActivityModel model;
    public LoginActivityPresenter(LoginActivityViewListener loginActivityViewListener){

        this.listener = loginActivityViewListener;
        this.model = new LoginActivityModel();

    }

    public void login(String username,String password){

        // 空判断 合法性
        model.login(username, password, new LoginActivityModelListener() {
            @Override
            public void success(Object object) {
                listener.success(object);
            }

            @Override
            public void onfailed() {
listener.onfailed();
            }
        });


    }

}

MainActivity的P层:
package muhanxi.myapplication.presenter;

import muhanxi.myapplication.bean.Bean;
import muhanxi.myapplication.model.MainActivityModel;
import muhanxi.myapplication.model.MainActivityModelListener;
import muhanxi.myapplication.view.MainActivityViewListener;

/**
 * Created by muhanxi on 17/10/14.
 */

public class MainActivityPresenter {


    private MainActivityViewListener listener;
    private MainActivityModel mainActivityModel;

    public MainActivityPresenter(MainActivityViewListener listener){

        this.listener = listener;
        this.mainActivityModel = new MainActivityModel();
    }


    public void getData(boolean up){

        mainActivityModel.getData(up, new MainActivityModelListener() {
            @Override
            public void callBackSuccess(Bean bean) {
                listener.callBackSuccess(bean);
            }

            @Override
            public void callBackFailure(int code) {
                listener.callBackFailure(code);
            }
        });

    }



}

获取屏幕尺寸的工具类:
package muhanxi.myapplication.utils;

import android.content.Context;
import android.graphics.Point;
import android.util.DisplayMetrics;

/**
 * Created by muhanxi on 17/10/14.
 */

public class Utils {

    /**
     * 获取设备屏幕尺寸
     * @param context
     * @return
     */
    public static Point getDisplayInfomation(Context context){
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return new Point(dm.widthPixels,dm.heightPixels);
    }

}

登录的V层:
package muhanxi.myapplication.view;

/**
 * Created by muhanxi on 17/10/14.
 */

public interface LoginActivityViewListener {

    public void success(Object object);
    public void onfailed();
}

MainActivity的V层:
package muhanxi.myapplication.view;

import muhanxi.myapplication.bean.Bean;

/**
 * Created by muhanxi on 17/10/14.
 */

public interface MainActivityViewListener  {
    public void callBackSuccess(Bean bean);
    public void callBackFailure(int code);


}

当然了,还有我们的javaBean:
package muhanxi.myapplication.bean;

import java.util.List;

/**
 * Created by muhanxi on 17/10/14.
 */

public class Bean {


    /**
     * ret_code : 200
     * ret_msg : ok
     * list : [{"date":"111","id":1,"pic":"http://p1.pstatp.com/large/22c90001cf8b5388ce33","title":" \n他\u201c秘书圈\u201d的人数规模,赶上了周永康","type":1},{"date":"333","id":3,"pic":"http://p1.pstatp.com/list/190x124/e580016ab3624f1ed33","title":"家里的一分硬币现在值多少钱?\n家里的一分硬币现在值多少钱?\n家里的一分硬币现在值多少钱?\n家里的一分硬币现在值多少钱?\n家里的一分硬币现在值多少钱","type":1},{"date":"444","id":4,"pic":"http://p1.pstatp.com/origin/26ec0004cc0249b49e7c","title":"世界上\u201c最恐怖\u201d的景点大盘点,中国竟然排在第一!","type":1},{"date":"6666","id":6,"pic":"http://p3.pstatp.com/list/190x124/216d001357929b02f476","title":" \n张爱朋首回应白百何绯闻事件,短短二句话,白百何后悔看错了吧!","type":1},{"date":"8888","id":8,"pic":"http://p1.pstatp.com/list/190x124/191a00048757f6714455","title":"中国又开工这一重大工程:连美国都造不出来 周边国家沉默不语","type":1},{"date":"99","id":9,"pic":"http://p3.pstatp.com/list/190x124/22c700036549c9b5ff07","title":"中国第一黑老大东北王乔四爷 最终也逃不过法网恢恢","type":1},{"date":"111","id":10,"pic":"http://p3.pstatp.com/list/190x124/22c6000628d79850e6d7","title":"号称中国关系最硬的人,奶奶是慈禧,大伯是光绪,哥哥是宣统!","type":1},{"date":"222","id":11,"pic":"http://p3.pstatp.com/list/190x124/22ca00011911b0a8061c","title":" \n\u201c二婚女和剩女,我该娶哪个啊?求救!\u201d","type":1},{"date":"2","id":18,"pic":"http://e.hiphotos.baidu.com/image/pic/item/bd315c6034a85edf392d2be340540923dc547549.jpg","title":"永创佳乐 专业蔬菜大棚/花卉大棚","type":1},{"date":"3","id":19,"pic":"http://c.hiphotos.baidu.com/image/pic/item/d000baa1cd11728ba5e562e2c1fcc3cec2fd2c22.jpg","title":"永创佳乐 专业蔬菜大棚/花卉大棚","type":1},{"date":"4","id":20,"pic":"http://e.hiphotos.baidu.com/image/pic/item/94cad1c8a786c91773f6c1f9c03d70cf3ac7577c.jpg","title":"永创佳乐 专业蔬菜大棚/花卉大棚","type":1},{"date":"5","id":21,"pic":"http://b.hiphotos.baidu.com/image/pic/item/32fa828ba61ea8d39c5a09c49e0a304e241f58f1.jpg","title":"中国又开工这一重大工程:连美国都造不出来 周边国家沉默不语","type":1},{"date":"6","id":22,"pic":"http://a.hiphotos.baidu.com/image/pic/item/359b033b5bb5c9ea1dc17023dc39b6003af3b33b.jpg","title":"中国又开工这一重大工程:连美国都造不出来 周边国家沉默不语","type":1},{"date":"7","id":23,"pic":"http://d.hiphotos.baidu.com/image/pic/item/38dbb6fd5266d0169a58eae99e2bd40734fa35a9.jpg","title":"中国又开工这一重大工程:连美国都造不出来 周边国家沉默不语","type":1},{"date":"8","id":24,"pic":"http://h.hiphotos.baidu.com/image/pic/item/5bafa40f4bfbfbed34f348bf71f0f736aec31f43.jpg","title":"中国又开工这一重大工程:连美国都造不出来 周边国家沉默不语","type":1},{"date":"9","id":25,"pic":"http://imgsrc.baidu.com/imgad/pic/item/9e3df8dcd100baa1706f8e964c10b912c8fc2e58.jpg","title":"中国又开工这一重大工程:连美国都造不出来 周边国家沉默不语","type":1}]
     */

    private int ret_code;
    private String ret_msg;
    private List<ListBean> list;

    public int getRet_code() {
        return ret_code;
    }

    public void setRet_code(int ret_code) {
        this.ret_code = ret_code;
    }

    public String getRet_msg() {
        return ret_msg;
    }

    public void setRet_msg(String ret_msg) {
        this.ret_msg = ret_msg;
    }

    public List<ListBean> getList() {
        return list;
    }

    public void setList(List<ListBean> list) {
        this.list = list;
    }

    public static class ListBean {
        /**
         * date : 111
         * id : 1
         * pic : http://p1.pstatp.com/large/22c90001cf8b5388ce33
         * title :
         他“秘书圈”的人数规模,赶上了周永康
         * type : 1
         */

        private String date;
        private int id;
        private String pic;
        private String title;
        private int type;

        public String getDate() {
            return date;
        }

        public void setDate(String date) {
            this.date = date;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getPic() {
            return pic;
        }

        public void setPic(String pic) {
            this.pic = pic;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }
    }
}

这样子  项目就完成了。
原创粉丝点击