学习目标
- 了解 SwipeRefreshLayout 控件
- 使用 SwipeRefreshLayout 实现 Recyclerview 下拉刷新
- 给 apdater 添加加载更多的 item 实现 Recyclerview 上拉加载更多功能
SwipeRefreshLayout简介
SwipeRefreshLayout 是谷歌推出的专门用于下拉刷新的控件。根据 API 的介绍,它应该被用在使用者想通过垂直的滑动手势来刷新一个 view 的内容,在 Activity 中实例化这个控件,同时加上 OnRefreshListener
来通知刷新手势完成。通过调用 setRefreshing(boolean x)
方法,设置 flase
来取消刷新指示;设置 true
显示刷新进度动画。如果想让下拉手势的刷新进度动画实效,可以调用 setEnabled(false)
方法。
SwipeRefreshLayout 作为 view 的父控件,仅支持作用于直接的子 view,子 view 的宽高和 SwipeRefreshLayout 控件的宽高相匹配。
应用实例
布局文件,SwipeRefreshLayout 嵌套 RecyclerView
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swip_refresh_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
下拉刷新代码
// 设置进度小圆圈下拉刷新时的缩放效果,以及开始、结束的位置
mSwipeRefreshLayout.setProgressViewOffset(true,0,100);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
list.clear();
list.addAll(getData());
mAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
}
});
关于上拉加载更多,先在 adapter 中添加加载更多的 item 样式
private static final int VIEW_TYPE_ITEM = 0;
private static final int VIEW_TYPE_FOOTER = 1;
private LayoutInflater mLayoutInflater;
private List mList;
public DataAdapter(Context context,List list) {
mLayoutInflater = LayoutInflater.from(context);
mList = list;
}
@Override
public DataAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_ITEM) {
return new MyHolder(mLayoutInflater.inflate(R.layout.item_layout,parent,false));
} else if (viewType == VIEW_TYPE_FOOTER) {
return new MyHolder(mLayoutInflater.inflate(R.layout.item_more,parent,false));
}
return null;
}
@Override
public void onBindViewHolder(DataAdapter.MyHolder holder, int position) {
if ( mList.size() != 0 && position < mList.size()) {
holder.textView.setText("position: "+position);
}
}
@Override
public int getItemCount() {
return mList.size() +1;
}
@Override
public int getItemViewType(int position) {
if (position == mList.size()) {
return VIEW_TYPE_FOOTER;
}
return VIEW_TYPE_ITEM;
}
class MyHolder extends RecyclerView.ViewHolder {
private TextView textView;
public MyHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.title);
}
}
在 Activity 中对 Recyclerview 设置滑动监听
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
boolean isSlidingToLast = false;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
isSlidingToLast = dy > 0;
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 不滚动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// 获取最后一个显示的 item position
int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
int totalItemCount = mLayoutManager.getItemCount();
// 判断是否滚动到底部
if (lastVisibleItem == (totalItemCount -1) ) {
List newDatas = getData();
if (newDatas != null) {
list.addAll(newDatas);
mAdapter.notifyDataSetChanged();
}
}
}
}
});