MVP模式 + RecyclerView瀑布流 + 上拉加载、下拉刷新
2017-10-14 15:55
465 查看
首先导入一些用到的依赖:(不要忘记添加网络权限)
// 包括OKhttp网络请求、springview刷新加载、butterknife相当于findviewbyid、glide加载图片
// recyclerview-flexibledivider分割线
直接导入依赖会报错,这时候需要在最外部的Gradle的allprojects中导入:
View层
utils工具类
// 包括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() { a967 @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); } }
相关文章推荐
- RecyclerView实例-实现可下拉刷新上拉加载更多并可切换线性流和瀑布流模式(1)
- RecyclerView实例-实现可下拉刷新上拉加载更多并可切换线性流和瀑布流模式(1)
- 使用MVP注册登录模块+封装的OKhttp,拦截器+QQ第三方登录+RecyclerView+SpringView上拉加载下拉刷新网络数据
- MVP和sqlite数据库,XRecyclerView上啦加载下拉刷新的第三方注册登录,列表
- MVP模式的OKhttp请求网络数据,xrecyclerview上拉刷新,下拉加载
- Mvp+OkHttp+XRecyclerView------上拉加载下拉刷新
- mvp下RecyclerView下拉刷新上拉加载Demo
- 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示
- SwipeRefrenshLayout结合RecyclerView在线性,网格,瀑布流中的下拉刷新与上拉加载
- MVP实现Recyclerview加Springview上拉加载下拉刷新点击条目可跳转到购物车
- mvp+retrofit+rxjava xrecyclerview实现多条目 下拉刷新 下拉加载 点击跳转
- Android Recycler View Header Footer 下拉刷新,自动加载更多,空view,loading view
- Android RecyclerView+item动画+下拉刷新,上拉加载更多,侧滑删除(易用可定制)
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载
- Android下拉刷新-SwipeRefreshLayout,RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout)
- RecyclerView 下拉刷新,自动加载更多
- RecyclerView系列之:添加下拉刷新和上拉加载更多
- Mvp模式--xlistview上拉加载下拉刷新——桃先森_
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
- 揭露RecyclerView的下拉刷新上拉加载的原理