前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用
这几天比较闲就自己来实现以下.
因为SwipeRefreshLayout是一个下拉刷新控件所有直接和RecycleView结合使用就行了
布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="tianliang.com.mvpdemo.MainActivity"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/SwipeRefreshLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/RecyclerView" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout> </RelativeLayout>
主代码
在里面使用了 butterknife 关联控件
public class MainActivity extends AppCompatActivity { @Nullable @BindView(R.id.RecyclerView) RecyclerView mRecyclerView; @Nullable @BindView(R.id.SwipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; private LinearLayoutManager mLayoutManager; private List<String> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); initData(); } private void initData() { mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); //初始化数据 data = new ArrayList<>(); for (int i = 1; i < 30; i++) { data.add("数据+" + i); } RecyclerViewAdapter mAdapter = new RecyclerViewAdapter(data);//设置adpater mRecyclerView.setAdapter(mAdapter);
//SwipeRefreshLayout监听 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() {//模仿加载网络数据 new Handler().postDelayed(new Runnable() { @Override public void run() {//每次刷新一条数据 data.add(0, "刷新出来的数据"); mRecyclerView.getAdapter().notifyDataSetChanged(); mSwipeRefreshLayout.setRefreshing(false); } }, 2000); } });
mRecyclerView.setOnScrollListener(new OnRcvScrollListener(){//使用自定义的RecycleView的底部监听
@Override
public void onBottom() {//接口回调
new Handler().postDelayed(new Runnable() {//模仿网络请求
@Override
public void run() {
if (data.size() <= 50) {
for (int i = 1; i < 5; i++) {
data.add("加载更多+" + i);
}
}
mRecyclerView.getAdapter().notifyDataSetChanged();//刷新adapter
}
}, 2000);
}
}
);
}
}
RecycleView的底部监听
使用的是 http://www.cnblogs.com/tianzhijiexian/p/4397552.html 写好的工具类
public abstract class OnRcvScrollListener extends RecyclerView.OnScrollListener implements OnBottomListener { private String TAG = getClass().getSimpleName(); public static enum LAYOUT_MANAGER_TYPE { LINEAR, GRID, STAGGERED_GRID } /** * layoutManager的类型(枚举) */ protected LAYOUT_MANAGER_TYPE layoutManagerType; /** * 最后一个的位置 */ private int[] lastPositions; /** * 最后一个可见的item的位置 */ private int lastVisibleItemPosition; /* *//** * 是否正在加载 *//* private boolean isLoadingMore = false;*/ /** * 当前滑动的状态 */ private int currentScrollState = 0; @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); // int lastVisibleItemPosition = -1; if (layoutManagerType == null) { if (layoutManager instanceof LinearLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR; } else if (layoutManager instanceof GridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.GRID; } else if (layoutManager instanceof StaggeredGridLayoutManager) { layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID; } else { throw new RuntimeException( "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager"); } } switch (layoutManagerType) { case LINEAR: lastVisibleItemPosition = ((LinearLayoutManager) layoutManager) .findLastVisibleItemPosition(); break; case GRID: lastVisibleItemPosition = ((GridLayoutManager) layoutManager) .findLastVisibleItemPosition(); break; case STAGGERED_GRID: StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager; if (lastPositions == null) { lastPositions = new int[staggeredGridLayoutManager.getSpanCount()]; } staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions); lastVisibleItemPosition = findMax(lastPositions); break; } } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); currentScrollState = newState; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE && (lastVisibleItemPosition) >= totalItemCount - 1)) { onBottom(); } } @Override public abstract void onBottom() ; private int findMax(int[] lastPositions) { int max = lastPositions[0]; for (int value : lastPositions) { if (value > max) { max = value; } } return max; } }
回调接口
public interface OnBottomListener { void onBottom(); }
apdater
根据条目是否是最后一条来显示对应的hoder
public class RecyclerViewAdapter extends RecyclerView.Adapter { private final List<String> mData; private int TYPE_FOOTER = 1;//加载更多 private int TYPE_NORMAL = 0;//itme public RecyclerViewAdapter(List<String> data) { mData = data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_FOOTER) {//加载更多 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapet, parent, false); footerHodler footer = new footerHodler(view,mData); return footer; } View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.itmeadapet, parent, false); itmeHoder hoder = new itmeHoder(view, mData.get(viewType)); return hoder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == TYPE_NORMAL && holder instanceof itmeHoder) { ((itmeHoder) holder).setData(mData.get(position)); }else if (getItemViewType(position) == TYPE_FOOTER && holder instanceof footerHodler){ ((footerHodler)holder).setData(); } } @Override public int getItemCount() { return mData.size() + 1; } @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return TYPE_FOOTER;//最后一条数据 } return TYPE_NORMAL; } }
ok,大体就是这样了