RecyclerView的简单使用,实现下拉刷新、上拉加载
来源:互联网 发布:网络建设与管理答案 编辑:程序博客网 时间:2024/06/05 10:49
一直用的ListView、最近才听别人说了一种控件RecyclerView,说是listView和gridview的升级版,就去研究了一下。把最简单的下拉刷新、上拉加载做出来了。本来研究这个东西,是想把侧滑删除,类似于QQ的效果做出来的,结果能力有限。首先,recyclerview是v7包里面的,要是想用这个控件就先去晚上找jar包吧。我是直接用AS的在线导包。这里我用到了两个包。recyclerview的com.android.support:recyclerview-v7:23.2.0,还有一个是cardview的com.android.support:cardview-v7:23.2.0。因为recyclerview的分隔线还要自己划,真特么坑爹。不过我也写了,后面有。这里我贴出主要代码,后面有项目安装包,下了看咯。反正不要积分。其实,我觉得recyclerview的用法跟listView是差不多的。都是拿数据,设置adapter。就是recyclerview多了几个方法。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; initData(); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe); verRecycler = (RecyclerView) findViewById(R.id.ver_recycle); mLayoutManager = new LinearLayoutManager(context); //布局管理器 verRecycler.setLayoutManager(mLayoutManager);// verRecycler.addItemDecoration(new MyVerDividerItemDecoration(context, MyVerDividerItemDecoration.VERTICAL_LIST)); //分隔线 MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(mDatas, context); verRecycler.setAdapter(adapter); //设置adapter setOnRefresh(); //刷新 setLoadMore();//加载 }
这是oncreate方法。recyclerview要有一个布局管理器。因为,他不仅可以竖着变成listview,他还可以横着变成gridview。他有三个子类,我这里用的是其中一个LinearLayoutManager。下面分别给出刷新和到底加载的方法,我没有重写recyclerview,所以,没有什么头布局,脚布局。据说,写起来很麻烦。
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if(isLoading){ //要刷新的时候,判断有没有在加载数据,如果在加载数据,就不让用户刷新 swipeRefreshLayout.setRefreshing(false); Toast.makeText(context, "正在加载,请稍后刷新", Toast.LENGTH_SHORT).show(); return; } isRefresh = true; swipeRefreshLayout.setRefreshing(true); if(timer ==null) timer = new Timer(); if(timerTask==null) timerTask = new TimerTask() { @Override public void run() { if (i == 0) { handler.sendEmptyMessage(0x001); } else { handler.sendEmptyMessage(0x002); } } }; i = 3; timer.schedule(timerTask, 0, 1000); } });
刷新我用的是SwipeRefreshLayout。这是谷歌出的一个控件。用起来感觉还不错。我之前刷新加载都是用的PullToRefresh的第三方jar。不过这个我已经用习惯了,我还是觉得PullToRefresh好用一些。
verRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int lastVisibleItem = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition(); int totalItemCount = mLayoutManager.getItemCount(); Log.v("WZ", "dx:" + dx + "->" + "dy:" + dy); Log.v("WZ", "lastVisibleItem:" + lastVisibleItem + "->" + "totalItemCount:" + totalItemCount); if (lastVisibleItem == totalItemCount - 4 && dy > 0) { if (isRefresh) { //到加载数据的时候,先判断有没有在刷新,如果在刷新就不让他加载 Toast.makeText(context, "正在刷新,请稍后加载", Toast.LENGTH_SHORT).show(); return; } if (isLoading) { Toast.makeText(context, "正在加载,请稍后...", Toast.LENGTH_SHORT).show(); } else { isLoading = true; } } } });
到底自动加载。这个应该见到很多遍了。没什么好说的。下面给出画线的工具类。
/** * RecyclerView画横向分隔线 * * Created by BML-KF on 2016/4/15. */public class MyVerDividerItemDecoration extends RecyclerView.ItemDecoration{ private int[] ATTRS = new int[]{android.R.attr.listDivider}; public static int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public MyVerDividerItemDecoration(Context context, int mOrientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); this.mOrientation = mOrientation; setOrientation(mOrientation); } private void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }}
至于Adapter我就不给出来了,自己下载了看吧。项目链接
1 1
- RecyclerView的简单使用,实现下拉刷新、上拉加载
- android 简单实现 RecyclerView 下拉刷新上拉加载
- RecyclerView实现上拉加载,下拉刷新
- RecyclerView实现上拉加载,下拉刷新
- RecyclerView 最简单的 下拉刷新 上拉加载
- Android 实现RecyclerView的下拉刷新和上拉加载
- RecyclerView 上拉加载更多下拉刷新的一种实现
- RecyclerView的上拉加载,下拉刷新
- 简单实现WaveSwipeRefreshLayout+RecyclerView的上拉加载下拉刷新的功能
- 【Android实战】----RecyclerView下拉刷新和上拉加载的简单实现
- android下拉刷新上拉加载简单的实现方法;
- 简单的上拉加载下拉刷新实现
- android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载
- android 打造真正的下拉刷新上拉加载recyclerview(三):下拉刷新上拉加载
- RecyclerView实现上拉刷新,下拉加载,item点击事件
- Android中RecyclerView实现下拉刷新上拉加载更多
- RecyclerView实现下拉刷新上拉加载更多
- RecyclerView实现下拉刷新和上拉加载更多
- VS 2013 中MFC程序编译过程出现 RC2108错误
- iOS网络编程3--swift中使用AFNetworking库
- LeetCode 59 Spiral Matrix II
- 实现winfrom进度条及进度信息提示,winfrom程序假死处理
- android AsyncTask介绍
- RecyclerView的简单使用,实现下拉刷新、上拉加载
- 搜索引擎选型调研文档
- 宇宙APP简单的性能测试
- 音乐播放器源码
- java中的wait()方法和sleep()方法的区别是什么?| Java 基础
- short s1 =1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错;float型float f=3.4是否正确?
- 3--双向链表
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题
- android多媒体框架之流媒体具体流程篇1----base on jellybean(十一)