【Android】给RecyclerView添加下拉刷新和加载更多(二)
2016-07-19 16:40
579 查看
大家都知道由于ListView的紧耦合问题,谷歌的改进就是RecyclerView本身不参与任何视图相关的问题。它不关心如何将子View放在合适的位置,也不关心如何分割这些子View,更不关心每个子View各自的外观。进一步来说,RecyclerView只负责回收和重用的工作,这就是它名字的由来。正是由于RecyclerView的插件化的特性,今天的目标是给RecyclerView加上下拉刷新和底部加载更多的功能。
下拉刷新使用到原生的SwipeRefreshLayout,当然大家也可以也可以使用开源项目来实现
加载更多在recyclerView的adapter中实现
还需要补充的是上一篇中没有实现的瀑布流效果
瀑布流的效果实现只需要更改两个位置①设置布局方式为StaggeredGridLayoutManager ②在适配器中随机设置每一个Item项的高度即可
再来看下拉刷新
加载更多是在我们的RecyclerView的适配器中实现的,即在我们正常的Item项的最下方加上一个FootView,也可以理解为一个特殊的Item项
点击下载源码
基于RecyclerView的优秀开源框架也不少,下面列举几个供大家参考
下拉刷新使用到原生的SwipeRefreshLayout,当然大家也可以也可以使用开源项目来实现
加载更多在recyclerView的adapter中实现
还需要补充的是上一篇中没有实现的瀑布流效果
瀑布流的效果实现只需要更改两个位置①设置布局方式为StaggeredGridLayoutManager ②在适配器中随机设置每一个Item项的高度即可
//为recyclerView设置布局方式 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
/** * Created by xiaoping on 2016/7/18. */ public class CaAdapter extends MyAdapter{ private List<Integer> mHeights; public CaAdapter(Context context, List<String> list) { super(context, list); mHeights = new ArrayList<Integer>(); } @Override public void onBindViewHolder(MyViewHolder holder, int pos) { super.onBindViewHolder(holder, pos); // 随机高度, 模拟瀑布效果. if (mHeights.size() <= pos) { mHeights.add((int) (100 + Math.random() * 300)); } ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); lp.height = mHeights.get(pos); holder.itemView.setLayoutParams(lp); } }
再来看下拉刷新
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/recylerview" android:layout_height="match_parent" android:layout_width="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout>
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); //设置进度条的颜色 swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //设置4秒后停止动画效果,这里可以根据网络请求的时间来停止刷新 Toast.makeText(MainActivity.this,"onRefresh there",Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { //模拟网络请求获取到数据 adapter.addItem(1, "onRefresh Item"); swipeRefreshLayout.setRefreshing(false); } },4000); } });
加载更多是在我们的RecyclerView的适配器中实现的,即在我们正常的Item项的最下方加上一个FootView,也可以理解为一个特殊的Item项
private final static int TYPE_ITEM = 100; private final static int TYPE_FOOTER = 101; @Override public int getItemViewType(int position) { // 最后一个item设置为footerView if (position + 1 == getItemCount()) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } //在整个View中添加一个footView @Override public int getItemCount() { return mList.size() + 1 ; } @Override public void onBindViewHolder(final MyViewHolder holder, final int pos) { if (pos + 1 == getItemCount()) { holder.tv.setText("点击加载更多..."); }else{ holder.tv.setText(mList.get(pos)); } if(itemClickLister != null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //使用ViewHolder取到的postion可以避免positon的错乱 int layoutPostion = holder.getLayoutPosition(); //回调接口中的方法 itemClickLister.OnItemClickLister(holder.itemView,layoutPostion); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int layoutPostion = holder.getLayoutPosition(); itemClickLister.OnItemLongClickLister(holder.itemView,layoutPostion); return true; } }); } }因为我们加了一个FootView,我们需要对他负责,相信大家都是社会主义未来接班人,这点责任感还是有的,我们需要在适配器的getItemView(),getItemCount(),onBindViewHolder()中对这个特殊的家伙进行特殊的处理。当然不要忘记在Activity中也是一样的道理。
adapter.setOnItemClickLister(new MyAdapter.OnItemClickLister() { @Override public void OnItemClickLister(View view, int pos) { if (pos + 1 >= mList.size()) { adapter.addItem(pos,"加载更多"); return; }else{ Toast.makeText(MainActivity.this,"CLick:" + mList.get(pos),Toast.LENGTH_SHORT).show(); } } @Override public void OnItemLongClickLister(View view, int pos) { Toast.makeText(MainActivity.this,"LongCLick:" + mList.get(pos),Toast.LENGTH_SHORT).show(); } });
点击下载源码
基于RecyclerView的优秀开源框架也不少,下面列举几个供大家参考
SwipeToLoadLayout
https://github.com/Aspsine/SwipeToLoadLayout
UltimateRecyclerView
https://github.com/cymcsg/UltimateRecyclerView
IRecyclerView
https://github.com/Aspsine/IRecyclerView
PullLoadMoreRecyclerView
https://github.com/WuXiaolong/PullLoadMoreRecyclerView
HeaderAndFooterRecyclerView
https://github.com/cundong/HeaderAndFooterRecyclerView
相关文章推荐
- Material Design系列,自定义Behavior实现Android知乎首页
- android实现底部菜单栏
- Android自动填充短信验证码
- Android通用流行框架大全
- Android AVD 创建设置中参数详解
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- Mac下Android Studio的环境搭建(奉送Genymotion配置)
- 解决listview setSelection不生效问题
- android.view.WindowManager$BadTokenException:is your actvity runing?
- 矩阵的乘法
- 对话框风格的Activity怎么设置主题:《Theme》
- ANDROID图片加载时出现OOM的一般处理方法
- Android 数据库升级解决方案
- Android快速屏幕尺寸适配 快速生成 res/dimens.xml
- 简单的朋友圈界面-Android(二)
- android AES加密代码
- Android下的MultDex
- Android input上报*、#键值笔记
- Android6.0 framework层权限相关源码分析
- 如何使用Android Studio开发/调试Android源码