Android--Google官方下拉刷新SwipeRefreshLayout(附加增加上拉加载)

Demo_SwipeRefreshLayout


转载请注明地址:http://blog.csdn.net/skyunicorn/article/details/51802724


下拉刷新是用系统的控件,但是这控件本身不带有上拉加载,上拉加载需要在ListView的Adapter中设置

需要V4包的支持
compile 'com.android.support:support-v4:23.4.0'

布局




    


代码设置

swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl);
// 刷新监听事件,必须有
swipeRefreshLayout.setOnRefreshListener(this);
  // 设置进度圈的背景色
//        swipeRefreshLayout.setProgressBackgroundColor(R.color.colorAccent);
        // 设置进度动画的颜色,可以使用多种颜色
        swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);

覆写onRefresh()方法

// 设置下拉刷新
@Override
public void onRefresh()
{
    initBDatas();
    // 关闭加载进度条
    mSwipeRefreshLayout.setRefreshing(false);
}

在主函数中添加RecyclerView的滑动监听

// RecyclerView的滑动监听事件
    private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener()
    {
        private int lastVisibleItem;

        // 滑动状态改变
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState)
        {
            super.onScrollStateChanged(recyclerView, newState);
            /**
             * scrollState有三种状态,分别是SCROLL_STATE_IDLE、SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING
             * SCROLL_STATE_IDLE是当屏幕停止滚动时
             * SCROLL_STATE_TOUCH_SCROLL是当用户在以触屏方式滚动屏幕并且手指仍然还在屏幕上时
             * SCROLL_STATE_FLING是当用户由于之前划动屏幕并抬起手指,屏幕产生惯性滑动时
             */
            if (newState == RecyclerView.SCROLL_STATE_IDLE
                    && lastVisibleItem + 1 == mAdapter.getItemCount()
                    && mAdapter.isShowFooter())
            {

                // 上拉加载更多
                initAData();
//                LogUtils.d(TAG, "loading more data");
//                mNewsPresenter.loadNews(mType, pageIndex + Urls.PAZE_SIZE);
            }
        }

        // 滑动位置
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {
            super.onScrolled(recyclerView, dx, dy);
            // 给lastVisibleItem赋值
            // findLastVisibleItemPosition()是返回最后一个item的位置
            lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
        }
    };


上拉加载,在Adapter中设置2套布局,一套是默认的item布局,一套是底部加载的显示布局

package com.demo.demo_swiperefreshlayout;

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.TextView;

import java.util.List;

/**
 * Created by YangJW on 2016/7/1 09:37.
 */
public class MyAdapter extends RecyclerView.Adapter
{

    // 设置底部布局
    private static final int TYPE_FOOTER = 0;
    // 设置默认布局
    private static final int TYPE_DEFAULT = 1;

    // 数据源
    private List mData;
    // 上下文
    private Context mContext;
    // 判断是不是最后一个item,默认是true
    private boolean mShowFooter = true;

    // 构造函数
    public MyAdapter(Context mContext)
    {
        this.mContext = mContext;
    }

    // 设置数据并刷新
    public void setData(List Data)
    {
        this.mData = Data;
        this.notifyDataSetChanged();
    }

    // 设置不同的item
    @Override
    public int getItemViewType(int position)
    {
        // 判断当前位置+1是不是等于数据总数(因为数组从0开始计数),是的就加载底部布局刷新,不是就加载默认布局
        if (position + 1 == getItemCount())
        {
            return TYPE_FOOTER;
        } else
        {
            return TYPE_DEFAULT;
        }
    }

    // 设置布局(相当于设置convertView)
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {

        if (viewType == TYPE_DEFAULT)
        {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, parent, false);

            DefaultViewHolder vh = new DefaultViewHolder(v);

            return vh;
        } else
        {
            // 实例化布局
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer, null);
            // 代码实现加载布局
            view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));

            return new FooterViewHolder(view);
        }
    }



    // 在布局中加载数据(绑定数据)
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        // 用来在运行时指出对象是某一个对象
        if (holder instanceof DefaultViewHolder)
        {
            String str = mData.get(position);

            if (str == null)
            {
                return;
            }

            ((DefaultViewHolder) holder).tv.setText(str);
        }
    }

    // 获取数据数目
    @Override
    public int getItemCount()
    {
        // 判断是不是显示底部,是就返回1,不是返回0
        int begin = mShowFooter? 1 : 0;
        // 没有数据的时候,直接返回begin
        if (mData == null)
        {
            return begin;
        }
        // 因为底部布局要占一个位置,所以总数目要+1
        return mData.size() + begin;
    }


    // 设置是否显示底部加载提示(将值传递给全局变量)
    public void isShowFooter(boolean showFooter)
    {
        this.mShowFooter = showFooter;
    }

    // 判断是否显示底部,数据来自全局变量
    public boolean isShowFooter()
    {
        return this.mShowFooter;
    }



    // 底部布局的ViewHolder
    public class FooterViewHolder extends RecyclerView.ViewHolder
    {
        public FooterViewHolder(View view)
        {
            super(view);
        }
    }

    // 默认布局的ViewHolder
    public class DefaultViewHolder extends RecyclerView.ViewHolder
    {

        public TextView tv;

        public DefaultViewHolder(View itemView)
        {
            super(itemView);

            tv = (TextView) itemView.findViewById(R.id.tv);

        }
    }


}


效果图


Android--Google官方下拉刷新SwipeRefreshLayout(附加增加上拉加载)_第1张图片



Demo地址:http://download.csdn.net/detail/skyunicorn/9565101






你可能感兴趣的:(Android-Demo大全)