RecycleView上拉加载与下拉刷新
2018-08-07 本文已影响87人
digtal_

下拉刷新
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
在布局中用SwipeRefreshLayout包裹RecyclerView然后在代码中设置SwipeRefreshLayout的监听即可
//设置下拉刷新
mRefreshLayout.setOnRefreshListener(this);
上拉加载
上拉加载主要是通过LayoutManger来判断条目滑动的位置是否是在最后一个再来进行加载更多的操作
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
//此时已经滑动到最后一个条目开始加载更多
if (layoutManager.getItemCount() - 1 == lastVisibleItemPosition && newState ==
RecyclerView.SCROLL_STATE_IDLE) {
LogUtils.LogE("加载更多1");
}
}
通过监听的回调方法就可以知道是否滑动到了最后一个条目
在Adapter中把加载更多的条目当作是脚布局放进去
//普通条目
private final int TYPE_NORMAL = 1;
//加载更多条目
private final int TYPE_LOAD_MORE = 2;
//加载完成
public static final int LOAD_COMPLETE = 3;
//加载中
public static final int LOADING = 4;
//全部加载完成
public static final int LOAD_END = 5;
private int mCurrentState;
private List<CartModel> mDatas;
public MyAdapter(List<CartModel> list) {
mDatas = list;
}
public void setCurrentState(int currentState) {
mCurrentState = currentState;
notifyDataSetChanged();
}
public void setData(List<CartModel> list) {
mDatas = list;
notifyDataSetChanged();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
RecyclerView.ViewHolder holder;
if (viewType == TYPE_NORMAL) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shopping_cart, parent, false);
holder = new MyHolder(view);
} else {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_load, parent, false);
holder = new LoadmoreHolder(view);
}
return holder;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if (getItemViewType(position) == TYPE_NORMAL) {
MyHolder myHolder = (MyHolder) holder;
myHolder.setItem(position);
} else {
LoadmoreHolder loadmoreHolder = (LoadmoreHolder) holder;
if (mCurrentState == LOADING) {//加载中
loadmoreHolder.mLoading.setVisibility(View.VISIBLE);
loadmoreHolder.mLoadEnd.setVisibility(View.GONE);
} else if (mCurrentState == LOAD_COMPLETE) {//加载完成
loadmoreHolder.mLoading.setVisibility(View.GONE);
loadmoreHolder.mLoadEnd.setVisibility(View.GONE);
} else if (mCurrentState == LOAD_END) {//全部加载完
loadmoreHolder.mLoading.setVisibility(View.GONE);
loadmoreHolder.mLoadEnd.setVisibility(View.VISIBLE);
}
}
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) {
return TYPE_LOAD_MORE;
} else {
return TYPE_NORMAL;
}
}
@Override
public int getItemCount() {//加的一是脚步局
return mDatas.size() + 1;
}
class MyHolder extends RecyclerView.ViewHolder {
TextView title;
ImageView imageViewAdd;
ImageView imageViewReduce;
TextView tvAmount;
TextView tvOld;
public MyHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.tv);
imageViewAdd = itemView.findViewById(R.id.iv_add);
imageViewReduce = itemView.findViewById(R.id.iv_reduce);
tvAmount = itemView.findViewById(R.id.tvamount);
tvOld = itemView.findViewById(R.id.tv_old);
tvOld.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
}
public void setItem(int position) {
CartModel cartModel = mDatas.get(position);
title.setText(cartModel.getName());
tvAmount.setText(String.valueOf(cartModel.getCount()));
}
}
class LoadmoreHolder extends RecyclerView.ViewHolder {
LinearLayout mLoading;
LinearLayout mLoadEnd;
public LoadmoreHolder(View itemView) {
super(itemView);
mLoading = itemView.findViewById(R.id.ll_loadmore);
mLoadEnd = itemView.findViewById(R.id.ll_nomore);
}
}
在Activity中来模拟请求数据,数据大于30个就表示全部加载完成
private SwipeRefreshLayout mRefreshLayout;
private RecyclerView mRecyclerView;
private List<CartModel> mList;
private MyAdapter mShoppingAdapter;
private boolean mIsStart;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loadmore);
mRefreshLayout = findViewById(R.id.refresh);
mRefreshLayout.setColorSchemeColors(Color.parseColor("#ff6600"));
mRecyclerView = findViewById(R.id.rv);
mList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
CartModel cartModel = new CartModel();
cartModel.setName("红烧牛肉面" + i);
mList.add(cartModel);
}
mShoppingAdapter = new MyAdapter(mList);
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
mRecyclerView.setAdapter(mShoppingAdapter);
//设置下拉刷新
mRefreshLayout.setOnRefreshListener(this);
//设置上拉加载更多
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
//此时已经滑动到最后一个条目开始加载更多
if (layoutManager.getItemCount() - 1 == lastVisibleItemPosition && newState == RecyclerView.SCROLL_STATE_IDLE) {
LogUtils.LogE("加载更多1");
if (mList.size() >= 30) {
mShoppingAdapter.setCurrentState(MyAdapter.LOAD_END);
} else {
if (!mIsStart)
onloadMore();
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
}
});
}
private void onloadMore() {
LogUtils.LogE("加载更多2");
mIsStart = true;
mShoppingAdapter.setCurrentState(MyAdapter.LOADING);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
CartModel cartModel = new CartModel("上拉加载更多出来的" + i, 1);
mList.add(cartModel);
}
mShoppingAdapter.setCurrentState(MyAdapter.LOAD_COMPLETE);
mShoppingAdapter.setData(mList);
mIsStart = false;
}
}, 1500);
}
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
CartModel cartModel = new CartModel("下拉刷新出来的数据", 1);
mList.add(0, cartModel);
mShoppingAdapter.setData(mList);
mRefreshLayout.setRefreshing(false);
}
}, 1500);
}