Demo_SwipeRefreshLayout
转载请注明地址:http://blog.youkuaiyun.com/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.youkuaiyun.com/detail/skyunicorn/9565101