Android RecyclerView + SwipeRefreshLayout 分页、下拉刷新
2017-02-07 13:37
429 查看
RecyclerView出现已经有一段时间了,可以通过导入support-v7对其进行使用。
据官方的介绍,该控件用于在有限的窗口中展示大量数据集,
其实这样功能的控件并不陌生,例如:ListView、GridView。
那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?
整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,
ItemDecoration , ItemAnimator实现非常炫的效果。
你想要控制其显示的方式,
请通过布局管理器LayoutManager你想要控制Item间的间隔(可绘制),
请通过ItemDecoration你想要控制Item增删的动画,
请通过ItemAnimator你想要控制点击、长按事件,自己实现。。。。。。。
实现非常简单
布局文件:
在RecyclerView包裹SwipeRefreshLayout
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh_widget" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/editTextRelayout"> <com.gsl.demo.utils.RefreshRecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/editTextRelayout" android:dividerHeight="18dp" android:scrollbars="vertical" /> </android.support.v4.widget.SwipeRefreshLayout>
RefreshRecyclerView(自定义的view)
public class RefreshRecyclerView extends RecyclerView {
private AutoLoadAdapter autoLoadAdapter;
public RefreshRecyclerView(Context context) {
this(context, null);
}
public RefreshRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RefreshRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private boolean isLoadingMore = false;//是否正在加载更多
private OnLoadMoreListener loadMoreListener;//加载数据监听
private boolean loadMoreEnable = false;//是否允许加载更多
private int footerResource = -1;//脚布局
private boolean footer_visible = false;//脚部是否可以见
private void init() {
setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (getAdapter() != null && getLayoutManager() != null) {
int lastVisiblePosition = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
int itemCount = getAdapter().getItemCount();
/**
* 控制下拉刷新回调
* itemCount != 0 排除没有数据情况
* lastVisiblePosition + 4 >= itemCount - 1 最后可见+4 >= 总条数 加载更多
* distanceY < 0 为上拉的时候才刷新
*/
if (distanceY < 0 && itemCount != 0 && lastVisiblePosition + 4 >= itemCount - 1 && !isLoadingMore && loadMoreEnable) {
Log.i("test","加载更多");
//正在加载更多
loading();
if (footerResource != -1){//有脚布局
//显示脚布局
footer_visible = true;
getAdapter().notifyItemChanged(itemCount - 1);
}
if (loadMoreListener != null) {
loadMoreListener.loadMoreListener();
}
}
4000
}
}
});
}
/**
* 判断滑动方向
*/
private float distanceY = 0;
float startY = 0;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
float y = ev.getRawY();
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
startY = y;
break;
case MotionEvent.ACTION_MOVE:
distanceY = y - startY;
startY = y;
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public void setAdapter(Adapter adapter) {
SlideInBottomAnimationAdapter slideInBottomAnimationAdapter = new SlideInBottomAnimationAdapter(adapter);
slideInBottomAnimationAdapter.setDuration(600);
autoLoadAdapter = new AutoLoadAdapter(slideInBottomAnimationAdapter);//添加动画
super.setAdapter(autoLoadAdapter);
}
/**
* 设置是否允许加载更多
*
* @param isEnable
*/
public void setLoadMoreEnable(boolean isEnable) {
this.loadMoreEnable = isEnable;
}
/**
* 设置脚布局
*/
public void setFooterResource(int footerResource) {
this.footerResource = footerResource;
}
/**
* 加载完成
*/
private void loadMoreComplete() {
this.isLoadingMore = false;
}
/**
* 正在刷新
*/
private void loading(){
this.isLoadingMore = true;//设置正在刷新
}
/**
* 加载更多数据回调
*
* @param listener
*/
public void setOnLoadMoreListener(OnLoadMoreListener listener) {
this.loadMoreListener = listener;
}
public interface OnLoadMoreListener {
void loadMoreListener();//上拉刷新
}
/**
* 刷新数据
*/
public void notifyData() {
if (getAdapter() != null) {
loadMoreComplete();
if(footerResource != -1 && loadMoreEnable){
//隐藏脚布局
footer_visible = false;
}
getAdapter().notifyDataSetChanged();
}
}
public class AutoLoadAdapter extends Adapter<ViewHolder> {
private Adapter dataAdapter;//数据adapter
private final int TYPE_FOOTER = Integer.MAX_VALUE;//底部布局
public AutoLoadAdapter(Adapter adapter) {
this.dataAdapter = adapter;
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1 && loadMoreEnable && footerResource != -1 && footer_visible) {
return TYPE_FOOTER;
}
if (dataAdapter.getItemViewType(position) == TYPE_FOOTER) {
throw new RuntimeException("adapter中itemType不能为:" + Integer.MAX_VALUE);
}
return dataAdapter.getItemViewType(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder holder = null;
if (viewType == TYPE_FOOTER) {//脚部
holder = new FooterViewHolder(LayoutInflater.from(getContext()).inflate(footerResource, parent, false));
} else {//数据
holder = dataAdapter.onCreateViewHolder(parent, viewType);
}
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int itemViewType = getItemViewType(position);
if (itemViewType != TYPE_FOOTER) {
dataAdapter.onBindViewHolder(holder, position);
}
}
@Override
public int getItemCount() {
if (dataAdapter.getItemCount() != 0) {
int count = dataAdapter.getItemCount();
if (loadMoreEnable && footerResource != -1 && footer_visible) {
count++;
}
return count;
}
return 0;
}
public class FooterViewHolder extends ViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
}
}
activity中:
mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_red_light, android.R.color.ho lo_blue_light, android.R.color.holo_green_light); recyclerView.setLoadMoreEnable(true);//允许加载更多 recyclerView.setFooterResource(R.layout.item_footer);//设置脚布局 recyclerView.setOnLoadMoreListener(new RefreshRecyclerView.OnLoadMoreListener() { @Override public void loadMoreListener() { handler.postDelayed(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { statisticsResponseModel = new StatisticsResponseModel(); statisticsResponseModel.setName("OK" + i); mList.add(statisticsResponseModel); } mRefreshAdapter.setmList(mList); recyclerView.notifyData();//刷新数据 } }, 5000); } });//分页 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { handler.postDelayed(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(false); recyclerView.notifyData();//刷新数据 } }, 2000); } }); }//下拉刷新
gradle文件添加: compile 'jp.wasabeef:recyclerview-animators:1.3.0'
有问题联系:1808418098(微信、QQ)
相关文章推荐
- android 自定义下拉刷新上拉加载控件(SwipeRefreshLayout + recyclerView)
- android-- 自定义下拉刷新上拉加载控件(SwipeRefreshLayout + recyclerView)
- Android开发 解决RecyclerView in SwipeRefreshLayout触发下拉刷新的bug
- [Android实例] Android 6.0RecyclerView SwipeRefreshLayout 下拉刷新 上拉加载
- SwipeRefreshLayout + RecyclerView实现上拉加载和下拉刷新
- 解决Android SwipeRefreshLayout & RecyclerView使用的Bug
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- Android 下拉刷新控件SwipeRefreshLayout结合WebView使用
- RecyclerView+SwipeRefreshLayout+ViewPager实现上拉加载更多下拉刷新和添加Banner(附源码)
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- Android 下拉刷新控件SwipeRefreshLayout结合WebView使用
- 4.5.2 SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- Retrofit+RecyclerView+SwipeRefreshlayout实现上拉刷新和分页加载
- Android_RecyclerView&SwipeRefreshLayout_swiperefreshlayout不显示_解决
- Android 下拉刷新控件SwipeRefreshLayout结合WebView使用
- SwipeRefreshLayout+RecyclerView实现下拉刷新
- Google自己的下拉刷新组件 SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView+RecyclerView.Adapter 实现 上拉刷新 和 下拉刷新