RecyclerView和SwipeRefreshLayout下拉刷新和上拉加载
来源:互联网 发布:游戏录制软件 编辑:程序博客网 时间:2024/06/05 07:33
最近用RecyclerView和SwipeRefreshLayout实现了一个下拉刷新和上拉加载更多的功能,在这里给大家分享一下。
一般下拉刷新和上拉加载更多是对服务器端发送请求,服务器端首先要写一个分页读取数据库的方法。例如getList(int pageNo).(下面就一直使用这个方法,来作为服务器端的方法)
1、xml布局文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="lzl.com.recyclerviewdemo.MainActivity"><android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/list_recycler" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView></android.support.v4.widget.SwipeRefreshLayout></RelativeLayout>
2、初始化数据
private void initView() { //设置刷新条 initSwipeRefresh(); recyclerView = (RecyclerView) findViewById(R.id.list_recycler); mLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setHasFixedSize(true); //初始化,一直显示第一条数据。 getList(1); //在设置adapter之前要先获取list集合。 recyclerView.setAdapter(adapter); footView = LayoutInflater.from(this).inflate(R.layout.recycler_foot,recyclerView,false); adapter.setFootView(footView); setRecyclerScrollListener(); } /** * 初始化下拉刷新条。 */ private void initSwipeRefresh(){ swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh); //设置刷新条的颜色 swipeRefreshLayout.setColorSchemeColors( R.color.colorAccent,R.color.colorPrimary,R.color.colorPrimaryDark); swipeRefreshLayout.setOnRefreshListener(this); //第一次进入页面时,显示加载进度条 swipeRefreshLayout.setProgressViewOffset(false,0,(int) TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources() .getDisplayMetrics())); swipeReFreshState(true); //开始进入界面,显示刷新条 }
以上是将SwipeRefreshLayout设置一些布局,
//设置刷新条的颜色 swipeRefreshLayout.setColorSchemeColors( R.color.colorAccent,R.color.colorPrimary,R.color.colorPrimaryDark); swipeRefreshLayout.setOnRefreshListener(this); //第一次进入页面时,显示加载进度条 swipeRefreshLayout.setProgressViewOffset(false,0,(int) TypedValue .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources() .getDisplayMetrics())); swipeReFreshState(true); //开始进入界面,显示刷新条 } private void swipeReFreshState(boolean b) { swipeRefreshLayout.setRefreshing(b); }
并且创建RecyclerView对象。
3、下拉刷新
主要是实现SwipeRefreshLayout的onRefresh()方法。然后执行获取数据的方法。下拉刷新一直是刷新最新的数据。
@Override public void onRefresh() { //先清空list集合中的数据 list.clear(); //刷新第一页数据 getList(1); } /** * 这里模拟分页,出入的是页数 * 然后根据每页显示的个数进行更新数据。 * @param pageNo */ public void getList(int pageNo){ pageNum = pageNo; int pageCount = 6; //每页显示6条数据。 for(int i=(pageNo-1)*pageCount;i<pageCount * pageNo;i++){ if(i == totalPage){ return; } list.add("显示第"+(i+1)+"条数据"); } pageNum++; adapter.notifyDataSetChanged(); //数据更新以后,刷新条消失 swipeReFreshState(false); }
4、上拉加载更多
调用RecyclerView的setOnScrollListener()方法,监听上拉加载事件的发生。
if(lastItem+1 == adapter.getItemCount() && newState == RecyclerView.SCROLL_STATE_IDLE)
具体的代码实现
private void setRecyclerScrollListener() { recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if(lastItem+1 == adapter.getItemCount() && newState == RecyclerView.SCROLL_STATE_IDLE){ //最后一个item并且还有下滑的趋势 if(lastItem+1 <= totalPage){ getList(pageNum); //显示底部加载信息 adapter.footVisible(); }else{ TextView loadMoreTv = (TextView) footView.findViewById(R.id.loadMore_tv); ProgressBar loadMorePb = (ProgressBar) footView.findViewById(R.id.loadMore_pb); loadMorePb.setVisibility(View.GONE); loadMoreTv.setText("没有更多数据"); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastItem = mLayoutManager.findLastVisibleItemPosition(); } }); }
5、Adapter布局的实现
因为设置有FootView的显示内容,所以List数据应该比实际的List数据多一。下面是具体的实现
public class MainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<String> list; private Context cxt; private final int TYPE_item = 1; private final int TYPE_FOOT = 2; private View footView; private int realListSize; public MainAdapter(Context context,List<String> list){ this.cxt = context; this.list = list; } public void setFootView(View foot){ this.footView = foot; footGone(); } public void footGone(){ if(footView == null){ return; } footView.setVisibility(View.GONE); } public void footVisible(){ if(footView == null){ return; } footView.setVisibility(View.VISIBLE); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(viewType == TYPE_FOOT && footView !=null){ //当viewType是TYPE_FOOT并且footView不为空的时候,就可以显示FootView了。 return new FootViewHolder(footView); } View view = LayoutInflater.from(cxt).inflate(R.layout.recyclerview_item,parent,false); return new DataViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof DataViewHolder){ //设置动态信息 ((DataViewHolder) holder).infoTv.setText(list.get(position)); } } @Override public int getItemViewType(int position) { //如果是最后一条数据,就返回FootView类型 if(position+1 == getItemCount()){ return TYPE_FOOT; } return TYPE_item; } @Override public int getItemCount() { if(list==null){ return 0; } //如果footView为空的话,就是获取list.size()个数据。 realListSize = (footView == null ? list.size() : list.size()+1); return realListSize; } class DataViewHolder extends RecyclerView.ViewHolder { TextView infoTv; public DataViewHolder(View itemView) { super(itemView); infoTv = (TextView) itemView.findViewById(R.id.info_tv); } } class FootViewHolder extends RecyclerView.ViewHolder { public FootViewHolder(View itemView) { super(itemView); } }}
源码下载http://download.csdn.net/detail/u011521890/9487290
0 0
- RecyclerView和SwipeRefreshLayout下拉刷新和上拉加载
- SwipeRefreshLayout和RecyclerView实现下拉刷新和上拉加载
- SwipeRefreshLayout + RecyclerView实现上拉加载和下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉加载更多
- Swiperefreshlayout与Recyclerview下拉刷新和上拉加载
- SwipeRefreshLayout下拉刷新和上拉加载
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
- java自学中的一些小问题(IO流)
- Oracle TRUNCATE语法
- SCI论文从入门到精通
- WebDriver常用API
- Unable to execute dex: Multiple dex files define问题
- RecyclerView和SwipeRefreshLayout下拉刷新和上拉加载
- SVM
- SCI论文投稿窍门
- connect函数简析
- 11、mongodb的主从复制集群
- MVP与MVVM模式
- php_file_contents模拟浏览器乱码
- Mybatis 一对一关系映射
- jsp中读取properties文件