RecyclerView与SwipeRefreshLayout的完美搭配
- setOnRefreshListener(OnRefreshListener):下拉刷新监听器,当用户下拉的时候会触发
- setRefreshing(boolean):设置SwipeRefreshLayout当前是否处于刷新状态,一般是在请求数据的时候设置为true,在数据被加载到View中后,设置为false。
- isRefreshing():检查是否处于刷新状态
- setColorSchemeResources():设置进度条的颜色主题,最多设置四种,以前的setColorScheme()方法已经弃用了。
- setProgressViewOffset(boolean scale, int start, int end) 调整进度条距离屏幕顶部的距离
<?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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.xmr.recycleandswiperefresh.MainActivity"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/srl_main" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/ryv_main" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> </RelativeLayout>
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //实际项目中这里一般是用网络请求获取数据 mList.add("下拉刷新"); mAdapter.notifyDataSetChanged(); mSwipeRefreshLayout.setRefreshing(false); } });
第一种,下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的效果
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mAdapter.getItemCount()) { mSwipeRefreshLayout.setRefreshing(true); //实际项目中这里一般是用网络请求获取数据 mList.add("上拉加载"); //为了有刷新的效果,延迟关闭刷新效果 mSwipeRefreshLayout.postDelayed(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(false); mAdapter.notifyDataSetChanged(); } }, 2000); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //判断是当前layoutManager是否为LinearLayoutManager // 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法 if (linearLayoutManager instanceof LinearLayoutManager) { //获取最后一个可见view的位置 lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); //获取第一个可见view的位置 // int firstItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); } } });
我们在Adapter中实现:
package com.xmr.recycleandswiperefresh; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2016/9/13. */ public class RefreshAdapter1 extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<String> mDatas; private static final int TYPE_ITEM = 0; //普通Item View private static final int TYPE_FOOTER = 1; //底部FootView //已经到底了 public static final int PULLUP_LOAD_MORE = 0; //正在加载中 public static final int LOADING_MORE = 1; //上拉加载状态-默认为0 private int load_more_status = 0; public RefreshAdapter1(Context mContext, List<String> mDatas) { this.mContext = mContext; this.mDatas = mDatas; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //进行判断显示类型,来创建返回不同的View if (viewType == TYPE_ITEM) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_recycler_refresh, null); // view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, // LayoutParams.WRAP_CONTENT)); return new ItemHolder(view); } // type == TYPE_FOOTER 返回footerView else if (viewType == TYPE_FOOTER) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_recycler_footer, null); // view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, // LayoutParams.WRAP_CONTENT)); return new FooterHolder(view); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ItemHolder) { ItemHolder itemHolder = (ItemHolder) holder; itemHolder.textView.setText(mDatas.get(position)); } else if (holder instanceof FooterHolder) { FooterHolder footHolder = (FooterHolder) holder; //这句如果不注释,那么底部就会有添加的一个item footHolder.linearLayout.setVisibility(View.GONE); switch (load_more_status) { case PULLUP_LOAD_MORE: footHolder.linearLayout.setVisibility(View.GONE); // footHolder.textView.setText("已经到底了"); break; case LOADING_MORE: footHolder.linearLayout.setVisibility(View.VISIBLE); footHolder.textView.setText("正在加载更多数据..."); break; } } } @Override public int getItemCount() { return mDatas == null ? 0 : mDatas.size() + 1; } @Override public int getItemViewType(int position) { // 最后一个item设置为footerView if (position + 1 == getItemCount()) { return TYPE_FOOTER; } else { return TYPE_ITEM; } } class ItemHolder extends RecyclerView.ViewHolder { public TextView textView; public ItemHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.tv_item_recycler_refresh); } } class FooterHolder extends RecyclerView.ViewHolder { public TextView textView; public LinearLayout linearLayout; public FooterHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.tv_item_recycler_footer); linearLayout = (LinearLayout) itemView.findViewById(R.id.ll_item_recycler_footer); } } /** * //上拉加载更多 * PULLUP_LOAD_MORE=0; * //正在加载中 * LOADING_MORE=1; * //加载完成已经没有更多数据了 * NO_MORE_DATA=2; * * @param status */ public void changeMoreStatus(int status) { load_more_status = status; notifyDataSetChanged(); } }
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mAdapter.getItemCount()) { Log.i(">>>>>", ">>>>" + lastVisibleItem + ">>>" + mAdapter.getItemCount()); mAdapter.changeMoreStatus(mAdapter.LOADING_MORE); //为了有刷新的效果,延迟2s修改状态 new Handler().postDelayed(new Runnable() { @Override public void run() { mAdapter.changeMoreStatus(RefreshAdapter1.PULLUP_LOAD_MORE); //实际项目中这里一般是用网络请求获取数据 mList.add("上拉加载"); } }, 2000); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //判断是当前layoutManager是否为LinearLayoutManager // 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法 if (linearLayoutManager instanceof LinearLayoutManager) { //获取最后一个可见view的位置 lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); //获取第一个可见view的位置 // int firstItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); } } }); }
参考:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS - Share 分享/第三方登录
1、系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China。如果不设置此项弹出的分享页面中显示的按钮为英文说明。 UIActivityViewController 方式创建 // 设置分享的内容 NSString *textToShare = @"请大家登录《iOS云端与网络通讯》服务网站。"; UIImage *imageToShare = [UIImage imageNamed:@"swift"]; NSURL *urlToShare = [NSURL URLWithString:@"http://m.baidu.com"]; // 创建分享视图控制器 /* activityItems: 分享的内容 applicationActivities: 分享的类型,默认(nil)时为 UIActivity */ NSArray *items = @[textToShare, imageToShare, urlToShare]; UIActivityViewController *act...
- 下一篇
Error:Execution failed for task ':app:mergeDebugResources'. > ...
Android Studio 编译中断.... Error:Execution failed for task ':app:mergeDebugResources'. > Some file crunching failed, see logs for details 错误信息如上: 解决方案: drawable里面的图片格式保存不对,Android studio 当编译资源文件的时候(using AAPT(Android Asset Packaging Tool))会抛出异常, 只需要用图片编辑工具,打开重新保存为.png图片,重新用新的图片,编译,即可。
相关文章
文章评论
共有0条评论来说两句吧...