RecyclerView实现下拉刷新与自动加载控件封装
2017-02-16 16:18
519 查看
前端时间自己整合了一个listview实现的下拉刷新上拉自动加载的demo,有需要的看这里listview实现下拉刷新上拉自动加载,由于新版本APP采用到RecyclerView,发现找不到一个好的简单的效果,于是抽几天时间,结合大牛们的文章,整合出一个比较简洁的RecyclerView实现下拉刷新与自动加载控件
2.数据为空的效果图
3.下拉刷新的效果
4.加载更多时效果
5.没有更多数据时的效果
csdn
一.废话不多少看效果(本人比较笨,不会制作动态图,哈哈哈):
1.第一进入页面的效果图
2.数据为空的效果图
3.下拉刷新的效果
4.加载更多时效果
5.没有更多数据时的效果
二.代码放送
自定义一个控件MyRecycleView 继承linearlayout,将RecycleView和SwipeRefreshLayout添加 进去即可实现下拉刷新效果,对于自动加载布局,需要添加footview,可惜RecycleView 不是自带footview,那么就要自己通过itemType的不同来实现footview,这里需要通过 adapter实现,那么就需要自己定义一个LoadMoreWrapper,用于接收设置的adapter进行装饰
1.自定义一个通用的adapter
CommonAdapter.java
public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> { protected Context mContext; protected int mLayoutId; protected List<T> mDatas; protected LayoutInflater mInflater; protected OnItemClickListener mOnItemClickListener; public CommonAdapter(Context context, int layoutId, List<T> datas) { mContext = context; mInflater = LayoutInflater.from(context); mLayoutId = layoutId; mDatas = datas; } protected boolean isEnabled(int viewType) { return true; } @Override public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { ViewHolder viewHolder = ViewHolder.createViewHolder(mContext, parent, mLayoutId); setListener(parent, viewHolder, viewType); return viewHolder; } protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) { if (!isEnabled(viewType)) return; viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { int position = viewHolder.getAdapterPosition(); mOnItemClickListener.onItemClick(v, viewHolder , position); } } }); viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (mOnItemClickListener != null) { int position = viewHolder.getAdapterPosition(); return mOnItemClickListener.onItemLongClick(v, viewHolder, position); } return false; } }); } @Override public void onBindViewHolder(ViewHolder holder, int position) { convert(holder, mDatas.get(position),position); } protected abstract void convert(ViewHolder holder, T t,int position); @Override public int getItemCount() { return mDatas.size(); } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.mOnItemClickListener = onItemClickListener; } public interface OnItemClickListener { void onItemClick(View view, RecyclerView.ViewHolder holder, int position); boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position); } }
2.定义一个LoadMoreWrapper
LoadMoreWrapper.java
public class LoadMoreWrapper<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2; private RecyclerView.Adapter mInnerAdapter; private View mLoadMoreView; private int mLoadMoreLayoutId; private RelativeLayout mFooterView; private View mNodataView; public LoadMoreWrapper(RecyclerView.Adapter adapter) { mInnerAdapter = adapter; } private boolean hasLoadMore() { return 4000 mLoadMoreView != null || mLoadMoreLayoutId != 0; } private boolean isShowLoadMore(int position) { return hasLoadMore() && (position >= mInnerAdapter.getItemCount()); } @Override public int getItemViewType(int position) { if (isShowLoadMore(position)) { return ITEM_TYPE_LOAD_MORE; } return mInnerAdapter.getItemViewType(position); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE_LOAD_MORE) { ViewHolder holder; if (mLoadMoreView != null) { mFooterView = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.myrecycle_footview, parent, false); mNodataView=LayoutInflater.from(parent.getContext()).inflate(R.layout.myrecycle_nodata_view, parent, false); mFooterView.addView(mLoadMoreView); mFooterView.addView(mNodataView); mNodataView.setVisibility(View.GONE); holder = ViewHolder.createViewHolder(parent.getContext(),mFooterView); } else { mFooterView = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.myrecycle_footview, parent, false); mNodataView=LayoutInflater.from(parent.getContext()).inflate(R.layout.myrecycle_nodata_view, parent, false); mLoadMoreView=LayoutInflater.from(parent.getContext()).inflate(R.layout.default_loading, parent, false); mFooterView.addView(mLoadMoreView); mFooterView.addView(mNodataView); mNodataView.setVisibility(View.GONE); holder = ViewHolder.createViewHolder(parent.getContext(),mFooterView); } return holder; } return mInnerAdapter.onCreateViewHolder(parent, viewType); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (isShowLoadMore(position)) { if (mOnLoadMoreListener != null) { mOnLoadMoreListener.onLoadMoreRequested(); } return; } mInnerAdapter.onBindViewHolder(holder, position); } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() { @Override public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) { if (isShowLoadMore(position)) { return layoutManager.getSpanCount(); } if (oldLookup != null) { return oldLookup.getSpanSize(position); } return 1; } }); } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { mInnerAdapter.onViewAttachedToWindow(holder); if (isShowLoadMore(holder.getLayoutPosition())) { setFullSpan(holder); } } private void setFullSpan(RecyclerView.ViewHolder holder) { ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(true); } } @Override public int getItemCount() { return mInnerAdapter.getItemCount() + (hasLoadMore() ? 1 : 0); } public interface OnLoadMoreListener { void onLoadMoreRequested(); } private OnLoadMoreListener mOnLoadMoreListener; public void setFootCanLoad(boolean footCanload) { if(hasLoadMore()) { if (footCanload) {//如果可以加载更多布局 mNodataView.setVisibility(View.GONE); } else { mNodataView.setVisibility(View.VISIBLE); } } } public LoadMoreWrapper setOnLoadMoreListener(OnLoadMoreListener loadMoreListener) { if (loadMoreListener != null) { mOnLoadMoreListener = loadMoreListener; } return this; } public LoadMoreWrapper setLoadMoreView(View loadMoreView) { mLoadMoreView = loadMoreView; return this; } public LoadMoreWrapper setLoadMoreView(int layoutId) { mLoadMoreLayoutId = layoutId; return this; }
3.对recycleview 的封装
public class MyRecycleView<T> extends LinearLayout { private static int VERTICAL = LinearLayout.VERTICAL; private static int HORIZONTAL = LinearLayout.HORIZONTAL; private RecyclerView recyclerView; private SwipeRefreshLayout swipeRfl; // private LinearLayoutManager layoutManager; private SwipeRefreshLayout.OnRefreshListener mRefreshListener; private CommonAdapter mAdapter; private RefreshLoadMoreListener mRefreshLoadMoreListner;//下拉和加载更多监听 private ItemClickListener itemClickListener;//item点击监听 private LinearLayout mExceptView; private LinearLayout mLoadingView; private boolean hasMore = false;//是否还有更多数据加载 private boolean canMore = true;//是否可以加载更多 private boolean isCanRefresh = true;//是否可以刷新更多 private boolean isRefresh = false;//正在刷新 private boolean isLoadMore = false;//正在加载更多 private LoadMoreWrapper mLoadMoreWrapper;//为了实现加载更多footview private static ImageView exceptIv;//异常图片控件 private static TextView exceptTv;//异常内容文本控件 private static ProgressBar loadingIv;//正在加载图片控件 private static TextView loadingTv;//正在加载文本控件 public MyRecycleView(Context context) { super(context); } public MyRecycleView(Context context, AttributeSet attrs) { super(context, attrs); LinearLayout rootLl = new LinearLayout(context); rootLl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mLoadingView = initLoadingView(context); mLoadingView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mExceptView = initExceptionView(context); mExceptView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mExceptView.setVisibility(View.GONE); swipeRfl = new SwipeRefreshLayout(context); swipeRfl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); swipeRfl.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light); FrameLayout bootLl = new FrameLayout(context); bootLl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); recyclerView = new RecyclerView(context); recyclerView.setVerticalScrollBarEnabled(true); recyclerView.setHorizontalScrollBarEnabled(true); recyclerView.setLayoutParams(new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); bootLl.addView(mLoadingView); bootLl.addView(recyclerView); bootLl.addView(mExceptView); swipeRfl.addView(bootLl); rootLl.addView(swipeRfl); this.addView(rootLl); /** * 下拉至顶部刷新监听 */ mRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (!isRefresh && !isLoadMore) { isRefresh = true; refresh(); } } }; swipeRfl.setOnRefreshListener(mRefreshListener); recyclerView.setHasFixedSize(true);//不是瀑布流这个将可以优化性能 } public MyRecycleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } /** * 错误提示界面初始化 * * @param context * @return */ private LinearLayout initExceptionView(Context context) { LinearLayout rootLl = new LinearLayout(context); rootLl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); rootLl.setOrientation(LinearLayout.VERTICAL); rootLl.setGravity(Gravity.CENTER); exceptIv = new ImageView(context); exceptIv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 点击图片刷新 if (!isRefresh) { swipeRfl.setRefreshing(true); isRefresh = true; refresh(); } } }); //底部边距 LinearLayout.LayoutParams ll = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); ll.setMargins(0, 0, 0, 32); exceptIv.setLayoutParams(ll); exceptTv = new TextView(context); exceptTv.setLayoutParams(ll); exceptTv.setTextSize(20.0f); exceptTv.setTextColor(Color.DKGRAY); //提示操作文本 TextView alertTv = new TextView(context); alertTv.setLayoutParams(ll); alertTv.setLayoutParams(ll); alertTv.setTextSize(18.0f); alertTv.setTextColor(Color.LTGRAY); alertTv.setText("点击图片刷新"); rootLl.addView(exceptIv); rootLl.addView(exceptTv); rootLl.addView(alertTv); return rootLl; } /** * 初始化正在加载页面 * * @param context * @return */ private LinearLayout initLoadingView(Context context) { LinearLayout rootLl = new LinearLayout(context); rootLl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); rootLl.setOrientation(LinearLayout.VERTICAL); rootLl.setGravity(Gravity.CENTER); loadingIv = new ProgressBar(context); //底部边距 LinearLayout.LayoutParams ll = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); ll.setMargins(0, 0, 0, 32); loadingIv.setLayoutParams(ll); loadingTv = new TextView(context); loadingTv.setLayoutParams(ll); loadingTv.setTextSize(20.0f); loadingTv.setTextColor(Color.LTGRAY); rootLl.addView(loadingIv); rootLl.addView(loadingTv); return rootLl; } /** * drawableId 错误提示图片 * exceptStr 错误提示语 */ public void customExceptView(int drawableId, String exceptStr) { recyclerView.setVisibility(View.INVISIBLE); mExceptView.setVisibility(View.VISIBLE); mLoadingView.setVisibility(View.INVISIBLE); exceptIv.setImageResource(drawableId); exceptTv.setText(exceptStr); swipeRfl.setEnabled(false);//出现错误之后,将设定无法下拉,运用点击图片进行刷新 } /** * drawableId 正在加载提示图片 * exceptStr 正在加载提示语 */ public void customLoadView(String exceptStr) { recyclerView.setVisibility(View.INVISIBLE); mLoadingView.setVisibility(View.VISIBLE); mExceptView.setVisibility(View.INVISIBLE); loadingTv.setText(exceptStr); swipeRfl.setEnabled(false); } public void scrollToTop() { recyclerView.scrollToPosition(0); } public void setAdapter(CommonAdapter adapter) { if (adapter != null) { this.mAdapter = adapter; if (canMore) {//是否可以加载更多 mLoadMoreWrapper = new LoadMoreWrapper(mAdapter); mLoadMoreWrapper.setLoadMoreView(R.layout.default_loading); mLoadMoreWrapper.setOnLoadMoreListener(new LoadMoreWrapper.OnLoadMoreListener() { @Override public void onLoadMoreRequested() { /** * 无论水平还是垂直 */ if (hasMore && !isLoadMore && !isRefresh && canMore) { isLoadMore = true; loadMore(); } } }); recyclerView.setAdapter(mLoadMoreWrapper); } else { recyclerView.setAdapter(mAdapter); } mAdapter.setOnItemClickListener(new CommonAdapter.OnItemClickListener() { @Override public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) { if (itemClickListener != null) itemClickListener.onClick(view, holder, position); } @Override public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) { if (itemClickListener != null) itemClickListener.onLongClick(view, holder, position); return true; } }); } } public void setHasMore(boolean enable) { this.hasMore = enable; mLoadMoreWrapper.setFootCanLoad(hasMore); } public boolean isHasMore() { return hasMore; } public boolean isCanMore() { return canMore; } public void setCanMore(boolean canMore) { this.canMore = canMore; } public void setPullRefreshEnable(boolean enable) { isCanRefresh = enable; swipeRfl.setEnabled(enable); } public boolean getPullRefreshEnable() { return swipeRfl.isEnabled(); } public void loadMore() { if (mRefreshLoadMoreListner != null && hasMore && canMore) { mRefreshLoadMoreListner.onLoadMore(); } } /** * 加载更多完毕,为防止频繁网络请求,isLoadMore为false才可再次请求更多数据 */ public void setLoadMoreCompleted() { isLoadMore = false; } public void stopRefresh() { isRefresh = false; swipeRfl.setRefreshing(false); if (isCanRefresh) swipeRfl.setEnabled(true); } public void setRefreshLoadMoreListener(RefreshLoadMoreListener listener) { mRefreshLoadMoreListner = listener; } public void setOnItemClickListener(ItemClickListener listener) { itemClickListener = listener; } /** * 刷新动作,用于请求网络数据 */ public void refresh() { swipeRfl.setRefreshing(true); //recyclerView.setVisibility(View.VISIBLE); mExceptView.setVisibility(View.INVISIBLE); if (mRefreshLoadMoreListner != null) { mRefreshLoadMoreListner.onRefresh(); } } public void notifyDataSetChanged() { //firstload布局只能出现一次,所以这里判断如果显示,就隐藏 if (mLoadingView.getVisibility() == View.VISIBLE) { recyclerView.setVisibility(View.VISIBLE); mExceptView.setVisibility(View.INVISIBLE); mLoadingView.setVisibility(View.INVISIBLE); } if (mLoadMoreWrapper != null) mLoadMoreWrapper.notifyDataSetChanged(); else mAdapter.notifyDataSetChanged(); } /** * 第一次自动加载,不与无数据用同样布局是因为,这里要有动画效果,所以单独一个布局 */ public void firstLoadingView(String exceptS c836 tr) { customLoadView(exceptStr); isRefresh = true; if (mRefreshLoadMoreListner != null) { mRefreshLoadMoreListner.onRefresh(); } } /** * 获取刷新数据以后的处理 * * @param actAllList * @param tmp */ public void setDateRefresh(ArrayList<T> actAllList, ArrayList<T> tmp) { actAllList.clear(); stopRefresh();//如果刷新则停止刷新 if (tmp.isEmpty()) { customExceptView(R.drawable.no_data, "这里空空如也"); setHasMore(false); } else { recyclerView.setVisibility(View.VISIBLE); setHasMore(true); actAllList.addAll(tmp); } notifyDataSetChanged();//刷新完毕 } /** * 获取加载更多数据的处理 * * @param actAllList * @param tmpLoadmore */ public void setDateLoadMore(ArrayList<T> actAllList, ArrayList<T> tmpLoadmore) { if (tmpLoadmore.isEmpty()) { setHasMore(false);//如果没有更多数据则设置不可加载更多 setLoadMoreCompleted();//加载完毕 stopRefresh();//如果刷新则停止刷新 return; } setHasMore(true); actAllList.addAll(tmpLoadmore); setLoadMoreCompleted();//加载完毕 notifyDataSetChanged();//加载更多完毕 stopRefresh();//如果刷新则停止刷新 } public void setLayoutManager(RecyclerView.LayoutManager layoutManager) { recyclerView.setLayoutManager(layoutManager); } /** * 下拉刷新和自动加载监听 */ public interface RefreshLoadMoreListener { public void onRefresh(); public void onLoadMore(); } public interface ItemClickListener { public void onClick(View view, RecyclerView.ViewHolder holder, int position); public void onLongClick(View view, RecyclerView.ViewHolder holder, int position); } }
6.具体用法
public class MainActivity extends BaseActivity implements MyRecycleView.RefreshLoadMoreListener { @Override protected int getContentView() { return R.layout.activity_main; } private MyRecycleView prrv; private int page = 1; private int num = 15;//测试数据的总数量 private final static int PAGESIZE = 10; private CommonAdapter<ActivityBean> mAdapter; /** * 全部活动数据源 */ private ArrayList<ActivityBean> actAllList = new ArrayList<ActivityBean>(); private boolean isFirstIn = true;//是否第一次加载 @Override protected void afterView() { setTitle("下拉刷新demo"); prrv = (MyRecycleView) findViewById(R.id.prrv);//绑定组合控件自定义的myrecycleview initAdapter();//初始化适配器 prrv.setRefreshLoadMoreListener(this);//下拉上拉加载更多监听 //prrv.setPullRefreshEnable(false);//禁用刷新 //prrv.setCanMore(false);//禁用加载更多用在setAdapter()之前 //设置布局管理 //recyclerView.setLayoutManager(); //recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); //LinearLayoutManager layoutManager = new LinearLayoutManager(this); StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL); //GridLayoutManager layoutManager= new GridLayoutManager(this, 2); prrv.setLayoutManager(layoutManager); prrv.setAdapter(mAdapter); //条目监听 prrv.setOnItemClickListener(new MyRecycleView.ItemClickListener() { @Override public void onClick(View view, RecyclerView.ViewHolder holder, int position) { Toast.makeText(MainActivity.this, "click-pos = " + position, Toast.LENGTH_SHORT).show(); } @Override public void onLongClick(View view, RecyclerView.ViewHolder holder, int position) { Toast.makeText(MainActivity.this, "longclick-pos = " + position, Toast.LENGTH_SHORT).show(); } }); } /** * 初始化适配器 */ private void initAdapter() { mAdapter = new CommonAdapter<ActivityBean>(this, R.layout.fragment_discover_cardview_item, actAllList) { @Override protected void convert(ViewHolder holder, ActivityBean a, int position) { holder.setText(R.id.activity_title, a.getActTitile()); /*holder.setText(R.id.activity_date, Utils.longtimeToDayDate(a .getStartDate()) + "-" + Utils.longtimeToDayDate(a.getEndDate()));*/ holder.setText(R.id.activity_date, a.getUrl()); } }; } /** * 首次进入刷新 */ @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // 第一次进入自动刷新 if (isFirstIn) { prrv.firstLoadingView("数据加载中"); isFirstIn = false; } } /** * 加载分页数据 */ public ArrayList<ActivityBean> loadNetDatas() { ArrayList<ActivityBean> tmp = new ArrayList<ActivityBean>(); int m = num < PAGESIZE ? num : PAGESIZE; for (int i = 0; i < m; i++) { ActivityBean ab = new ActivityBean(); ab.setActId(i * 10 + ""); if (i % 3 == 0) ab.setActTitile("下拉刷新自动加载"); else { ab.setActTitile("下拉刷新自动加载的recyclviewActivity"); } ab.setCollected(false); ab.setCollectNum(i); ab.setEndDate(1428881600); ab.setImgUrl(""); ab.setStartDate(1428681600); ab.setTop(false); if (i % 2 == 0) ab.setUrl("下拉刷新自动加载"); else { ab.setUrl("下拉刷新自动加载的recyclviewActivity"); } tmp.add(ab); num--; } return tmp; } @Override public void onRefresh() { num = 13; page = 1; mHandler.sendEmptyMessageDelayed(0, 2000); System.out.println("onRefresh"); } @Override public void onLoadMore() { // TODO Auto-generated method stub page++; mHandler.sendEmptyMessageDelayed(1, 2000); System.out.println("onLoadMore"); } private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0://处理刷新的数据 ArrayList<ActivityBean> tmp = loadNetDatas(); prrv.setDateRefresh(actAllList, tmp); ToastUtil.ToastCenter(MainActivity.this, "刷新完成"); break; case 1:// 处理加载更多的数据 ArrayList<ActivityBean> tmpLoadmore = loadNetDatas(); prrv.setDateLoadMore(actAllList, tmpLoadmore); break; } } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_delete) { actAllList.clear(); prrv.notifyDataSetChanged(); page = 1; prrv.customExceptView(R.drawable.no_data, "这里空空如也"); return true; } if (id == R.id.action_refreshable) { if (prrv.getPullRefreshEnable()) { prrv.setPullRefreshEnable(!prrv.getPullRefreshEnable()); } else { prrv.setPullRefreshEnable(!prrv.getPullRefreshEnable()); } return true; } if (id == R.id.action_loadmoreable) { if (prrv.isHasMore()) { prrv.setHasMore(!prrv.isHasMore()); } else { prrv.setHasMore(!prrv.isHasMore()); } return true; } if (id == R.id.action_stoprefresh) { prrv.stopRefresh(); return true; } if (id == R.id.action_scrollToTop) { prrv.scrollToTop(); return true; } return super.onOptionsItemSelected(item); } }
三.demo下载地址
githubcsdn
相关文章推荐
- 封装 RecyclerView, 打造为一个非常实用的开发工具 , 添加一些开发中常用的功能 , 例如下拉刷新, 分页, 自动加载 , 加载错误等等
- RecyclerView 实现下拉刷新和自动加载
- android 打造真正的下拉刷新上拉加载recyclerview(四):自动加载和其他封装
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android-RecyclerView使用(三) 实现下拉刷新,上拉自动加载
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- SwipeRefreshLayout+RecyclerView实现下拉刷新上拉自动加载
- 基于RecyclerView的封装,仿qq侧拉删除效果,实现下拉刷新,上拉加载更多,添加header,添加footer
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- 封装RecyclerViewAdapter实现RecyclerView下拉刷新上拉加载更多
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- android 打造真正的下拉刷新上拉加载recyclerview(四):自动加载和其他封装
- RecyclerView 实现下拉刷新和自动加载
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- SwipeRefreshLayout+RecyclerView实现下拉刷新上拉自动加载
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- 用google官方控件SwipeRefreshLayout实现RecyclerView的下拉刷新和上拉加载
- SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示
- 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载
- Android RecyclerView实现下拉刷新和上拉加载