您的位置:首页 > 移动开发 > Android开发

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

2016-07-01 16:43 316 查看
Demo_SwipeRefreshLayout

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

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

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

布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/srl"
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="com.demo.demo_swiperefreshlayout.MainActivity">

<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:scrollbars="vertical"></android.support.v7.widget.RecyclerView>

</android.support.v4.widget.SwipeRefreshLayout>


代码设置

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<RecyclerView.ViewHolder>
{

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

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

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

// 设置数据并刷新
public void setData(List<String> 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);

}
}

}


效果图



Demo地址:http://download.csdn.net/detail/skyunicorn/9565101
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SwipeRefreshLayout