1、SwipeRefrshLayout是Google官方更新的一个Widget,可以实现下拉刷新的效果。该控件集成自ViewGroup在support-v4兼容包下,不过我们需要升级supportlibrary的版本到19.1以上。
基本使用的方法如下:

setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器
setRefreshing(boolean):显示或者隐藏刷新进度条
isRefreshing():检查是否处于刷新状态
setColorSchemeResources():设置进度条的颜色主题,最多设置四种,以前的setColorScheme()方法已经弃用了。

2、 RecyclerView实现的列表,默认情况下面是不带下拉刷新和上拉加载更多效果的,但是我在我们的实际项目当中,为了提高用户体验,这种效果一般都需要实现。使用footer底部样式的xml来自定义加载更多的时候UI显示效果。

3、引入RecyclerView支持类库

4、使用SwipeRefreshLayout和RecyclerView布局activity_recycler_refresh.xml

<?xml version="1.0" encoding="utf-8"?>        

RecyclerView的item简单布局item_recycler.xml

<?xml version="1.0" encoding="UTF-8"?>

底部加载更多时显示的布局栏footer.xml

<?xml version="1.0" encoding="UTF-8"?>

5、引入SwipeRefreshLayout和RecyclerView的RecyclerRefreshActivity

public class RecyclerRefreshActivity extends Activity {    private SwipeRefreshLayout swipeRefreshLayout;    private RecyclerView recyclerView;    private RefreshRecyclerAdapter adapter;    private LinearLayoutManager linearLayoutManager;    private int lastVisibleItem;    private List lists;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_recycler_refresh);    swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefreshlayout);    recyclerView = (RecyclerView) findViewById(R.id.recyclerview);    // 设置刷新时动画的颜色,可以设置4个    swipeRefreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.white);    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.setProgressViewOffset(false, 0,            (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()));    linearLayoutManager = new LinearLayoutManager(this);    linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);    recyclerView.setLayoutManager(linearLayoutManager);    initData();    adapter = new RefreshRecyclerAdapter(this, lists);    recyclerView.setAdapter(adapter);    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {        @Override        public void onRefresh() {            //模拟网络请求            new Handler().postDelayed(new Runnable() {                @Override                public void run() {                    List newDatas = new ArrayList();                    for (int i = 0; i < 5; i++) {                        int index = i + 1;                        newDatas.add("new item" + index);                    }                    adapter.addItem(newDatas);                    swipeRefreshLayout.setRefreshing(false);                    Toast.makeText(RecyclerRefreshActivity.this, "更新了" + newDatas.size() + "条数据",                            Toast.LENGTH_SHORT).show();                }            }, 5000);        }    });    // RecyclerView滑动监听    recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {        @Override        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {            super.onScrollStateChanged(recyclerView, newState);            if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) {                adapter.changeMoreStatus(RefreshRecyclerAdapter.LOADING_MORE);                //模拟网络请求                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        List newDatas = new ArrayList();                        for (int i = 0; i < 5; i++) {                            int index = i + 1;                            newDatas.add("add more item" + index);                        }                        adapter.addMoreItem(newDatas);                        adapter.changeMoreStatus(RefreshRecyclerAdapter.PULLUP_LOAD_MORE);                    }                }, 2500);            }        }        @Override        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {            super.onScrolled(recyclerView, dx, dy);            lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();        }    });}// 初始化模拟数据private void initData() {    lists = new ArrayList();    for (int i = 0; i < 20; i++) {        int index = i + 1;        lists.add("item初始化数据" + index);        }    }}

绑定RecyclerView的适配器,用于加载数据RefreshRecyclerAdapter

public class RefreshRecyclerAdapter extends RecyclerView.Adapter {/** * 上拉加载更多 */public static final int PULLUP_LOAD_MORE = 0;/** *  正在加载中 */public static final int LOADING_MORE = 1;/** *  上拉加载更多状态-默认为0 */private int loading_status = 0;/** *  普通Item View */private static final int TYPE_ITEM = 0;/** *  底部FootView */private static final int TYPE_FOOTER = 1; private LayoutInflater mInflater;private List lists;public RefreshRecyclerAdapter(Context context, List lists) {    this.mInflater = LayoutInflater.from(context);    this.lists = lists;}/** * item显示类型 *  * @param parent * @param viewType * @return */public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    // 进行判断显示类型,来创建返回不同的View    if (viewType == TYPE_ITEM) {        View view = mInflater.inflate(R.layout.item_recycler, parent, false);        // 这边可以做一些属性设置,甚至事件监听绑定        // view.setBackgroundColor(Color.RED);        ItemViewHolder itemViewHolder = new ItemViewHolder(view);        return itemViewHolder;    } else if (viewType == TYPE_FOOTER) {        View foot_view = mInflater.inflate(R.layout.footer, parent, false);        // 这边可以做一些属性设置,甚至事件监听绑定        // view.setBackgroundColor(Color.RED);        FootViewHolder footViewHolder = new FootViewHolder(foot_view);        return footViewHolder;    }    return null;}/** * 数据的绑定显示 *  * @param holder * @param position */public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {    if (holder instanceof ItemViewHolder) {        ((ItemViewHolder) holder).tvItem.setText(lists.get(position));        holder.itemView.setTag(position);    } else if (holder instanceof FootViewHolder) {        FootViewHolder footViewHolder = (FootViewHolder) holder;        switch (loading_status) {        case PULLUP_LOAD_MORE:            footViewHolder.tvFooter.setText("上拉加载更多...");            break;        case LOADING_MORE:            footViewHolder.tvFooter.setText("正在加载更多数据...");            break;        }    }}/** * 进行判断是普通Item视图还是FootView视图 */@Overridepublic int getItemViewType(int position) {    // 最后一个item设置为footerView    if (position + 1 == getItemCount()) {        return TYPE_FOOTER;    } else {        return TYPE_ITEM;    }}@Overridepublic int getItemCount() {    return lists.size() + 1;}// 自定义的ViewHolder,持有每个Item的的所有界面元素public static class ItemViewHolder extends RecyclerView.ViewHolder {    public TextView tvItem;    public ItemViewHolder(View view) {        super(view);        tvItem = (TextView) view.findViewById(R.id.tv_item);    }}/** * 底部FootView布局 */public static class FootViewHolder extends RecyclerView.ViewHolder {    private TextView tvFooter;    public FootViewHolder(View view) {        super(view);        tvFooter = (TextView) view.findViewById(R.id.tv_foot_item);    }}// 添加数据,下拉public void addItem(List newDatas) {    newDatas.addAll(lists);    lists.removeAll(lists);    lists.addAll(newDatas);    notifyDataSetChanged();}// 添加数据,上拉public void addMoreItem(List newDatas) {    lists.addAll(newDatas);    notifyDataSetChanged();}/** * 改变状态 */public void changeMoreStatus(int status) {    loading_status = status;    notifyDataSetChanged();    }}

完成下拉刷新和上拉加载更多

更多相关文章

  1. 干货集中营 API 文档
  2. android webview 加载本地文件
  3. android应用程序启动解决黑屏及全屏显示时因数据加载缓慢出现标
  4. android webview的 一些设置(js java交互)
  5. Android开发——SQLite数据库(二)android studio创建数据库,进行插
  6. Android官方培训中文课程
  7. Android中VideoView播放视频不能充满屏幕以及视频上的view与视频
  8. Android中ListView下拉刷新的实现代码
  9. android 使用InstanceState保存和恢复数据

随机推荐

  1. Android Studio如何配置CURL指令一键打包
  2. Android命令行测试BT,WIFI,Sensor工作状态
  3. Android NDK学习 简介
  4. 去掉Button的默认背景
  5. Android(安卓)App实现仅有横屏切换功能或
  6. android 内存泄漏的分析
  7. Android软键盘弹出时把布局顶上去,控件乱
  8. Android:Property Animation
  9. ViewGroups
  10. Android(安卓)进程和线程(二)