MVP模式 + RecyclerView瀑布流 + 上拉加载、下拉刷新

来源:互联网 发布:nginx lua redis性能 编辑:程序博客网 时间:2024/06/06 06:56

首先导入一些用到的依赖:(不要忘记添加网络权限)

//  包括OKhttp网络请求、springview刷新加载、butterknife相当于findviewbyid、glide加载图片

//  recyclerview-flexibledivider分割线

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'annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'annotationProcessor 'com.github.bumptech.glide:compiler:4.2.0'
直接导入依赖会报错,这时候需要在最外部的Gradle的allprojects中导入:
maven { url 'https://maven.google.com' }
MVP模式:
activity_main.xml
<?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="com.bwie.mvprecyclerviewlogin.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>
adapter.xml
<?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
public class MainActivity extends AppCompatActivity implements RecyclerViewListener{    @BindView(R.id.recycleview)    RecyclerView recycleview;    @BindView(R.id.springview)    SpringView springview;    private RecyclerViewPresenter 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));        //  得到控件,设置recyclerview的显示样式,为适配器赋值        presenter = new RecyclerViewPresenter(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) {    }}
IAdapter
public class IAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private Context context;    private List<Bean.ListBean> list ;    private int itemWidth ;    public IAdapter(Context context) {        this.context = context;        Point point =  Utils.getDisplayInfomation(context);        itemWidth = point.x / 3 ;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = LayoutInflater.from(context).inflate(R.layout.adapter, parent, false);        IViewHolder viewHolder = new IViewHolder(view);        return viewHolder;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if(holder instanceof IViewHolder){            IViewHolder iViewHolder = (IViewHolder)holder;            //        float scale =  (float) itemWidth / (float) list.get(position).getPicWidth()  ;            //        params.width = itemWidth;            //        params.height = (int)( (float)scale * (float)list.get(position).getPicHeight()) ;            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) iViewHolder.adapterImageview.getLayoutParams() ;            params.width = itemWidth ;            int height =  new Random().nextInt(1000);            params.height =  height < 300 ? 300 : height ;            iViewHolder.adapterImageview.setLayoutParams(params);            //  请求网络图片            Glide.with(context).load(list.get(position).getPic()).into(iViewHolder.adapterImageview);        }    }    @Override    public int getItemCount() {        return list == null ? 0 : list.size();    }    //  数据    public void setData(Bean bean){        if(this.list == null){            this.list = new ArrayList<>();        }        this.list.addAll(bean.getList());        notifyDataSetChanged();    }    static class IViewHolder extends RecyclerView.ViewHolder {        @BindView(R.id.adapter_imageview)        ImageView adapterImageview;        IViewHolder(View view) {            super(view);            ButterKnife.bind(this, view);        }    }}
Bean
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;        }    }}


View层
RecyclerViewListener(接口)
public interface RecyclerViewListener {    public void callBackSuccess(Bean bean);    public void callBackFailure(int code);}
Presenter层
RecyclerViewPresenter
public class RecyclerViewPresenter {    private RecyclerViewModel recyclerViewModel;    private RecyclerViewListener listener;    public RecyclerViewPresenter(RecyclerViewListener listener){        this.listener = listener;        this.recyclerViewModel = new RecyclerViewModel();    }    public void  getData(boolean up){        recyclerViewModel.getData(up, new RecyclerViewModelListener() {            @Override            public void callbackSuccess(Bean bean) {                listener.callBackSuccess(bean);            }            @Override            public void callbackFalied(int code) {                listener.callBackFailure(code);            }        });    }}
model层
RecyclerViewModel
public class RecyclerViewModel {    //  从网络获取数据    public void getData(boolean up, final RecyclerViewModelListener listener){        OkHttpClient client = new OkHttpClient();        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.callbackFalied(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);            }        });    }}
RecyclerViewModelListener
public interface RecyclerViewModelListener {    public void callbackSuccess(Bean bean);    public void callbackFalied(int code);}

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





 
阅读全文
0 0
原创粉丝点击