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(); } } } } }); } /** * 判断滑动方向 */ 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)
新闻热点
疑难解答