RecyclerView上拉加载与CoordinatorLayout
来源:互联网 发布:数据仪表盘 编辑:程序博客网 时间:2024/05/13 01:06
demo# RecyclerView加载更多及下拉刷新
在2015年Google的年度大会上,已经升级了新的Support Library,视觉效果及用户体验毋庸置疑,所以今天主要简单主要介绍Material Design中最主要的二个控件,RecyclerView的上拉加载更多和CoordinatorLayout的结合使用,废话不多说,先上图:
CoordinatorLayout
从字面上理解,它是一个协调view,主要处理子view之间的相互依赖关系,增加交互体验,通过layoutDependsOn()来判断子view(child)是否依赖dependency,通过onDependentViewChanged()来判断子view(child)在所依赖view发生改变后的是否要做处理,好,我们看一下源码:
/** * Determine whether the supplied child view has another specific sibling view as a* layout dependency.* /public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) { return false; }/*** Respond to a change in a child's dependent view*/public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) { return false; }
如果有自定义功能我们可以extends CoordinatorLayout.Behavior,今天我们介绍简单使用,后续会对CoordinatorLayout.Behavior做详细探讨:
- 首先要在Gradle中加入Library
compile 'com.android.support:design:24.2.1'
- 在布局文件中加入CoordinatorLayout,如果是新建项目的话选择Navigation Drawer Actiivty模版会包含,这里加入了开源库NavigationTabStrip对demo中的viewpage做绑定
<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.recyclerviewmore.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> <com.gigamole.library.navigationtabstrip.NavigationTabStrip android:id="@+id/nts_bottom" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="center" android:background="@color/black_page_bg" app:nts_active_color="#fff" app:nts_color="@color/pink" app:nts_corners_radius="1.5dp" app:nts_factor="2.8" app:nts_inactive_color="#81ffffff" app:nts_titles="@array/titles" app:nts_typeface="fonts/drugs.otf" app:nts_weight="3dp" /> </android.support.design.widget.AppBarLayout> </android.support.design.widget.CoordinatorLayout>
这里需要注意的是,如果要实现图片中的Toolbar隐藏效果必须加入,Toolbar其实就是我们的上面提到的子view
app:layout_scrollFlags="scroll|enterAlways"
- 加入所依赖的behavior可以用ViewPager
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" ></android.support.v4.view.ViewPager>
同样必须加入
app:layout_behavior="@string/appbar_scrolling_view_behavior"
ok,至于下拉加载更多用SwipeRefreshLayout
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swiprefreshlayout" android:layout_width="match_parent" android:layout_height="match_parent"> <com.recyclerviewmore.widget.RecyclerViewUpRefresh android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"></com.recyclerviewmore.widget.RecyclerViewUpRefresh></android.support.v4.widget.SwipeRefreshLayout>
这样就简单实现了CoordinatorLayout的效果下面再介绍RecyclerView的上拉加载更多,与CoordinatorLayout配合使用,其实相对与大家比较熟悉的listview来说RecyclerView更灵活,是完美的替代品,所有效果都可以自定义
- 布局管理(LayoutManager)下面是最简单的用法,要特殊需求需要自定义LayoutManager
mRecyclerView.setLayoutManager(newLinearLayoutManager(getActivity()));
mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 3));
- 设置分割线(ItemDecoration) 要extends RecyclerView.ItemDecoration
ItemAnimator 动画效果
同样RecyclerView 实现 RecyclerView.Adapter可以实现丰富的ui效果,上拉加载更多就是利用Adapter中的viewtype来实现
- 重写RecyclerView的onScrollStateChanged
@Override public void onScrollStateChanged(int state) { super.onScrollStateChanged(state); if (state == RecyclerView.SCROLL_STATE_IDLE && loadMoreListener != null && !isLoadingData && canloadMore) { LayoutManager layoutManager = getLayoutManager(); int lastVisibleItemPosition; if (layoutManager instanceof GridLayoutManager) { lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { int[] into = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()]; ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(into); lastVisibleItemPosition = last(into); } else { lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); } if (layoutManager.getChildCount() > 0 && lastVisibleItemPosition >= layoutManager.getItemCount() - 1) { if (loadingMoreFooter != null) { loadingMoreFooter.setVisible(); } isLoadingData = true; loadMoreListener.onLoadMore(); } } }
- 根据viewType来显示FooterView
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == FOOTER) { return new SimpleViewHolder(loadingMoreFooter); } return adapter.onCreateViewHolder(parent, viewType); }
- 绑定数据
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { holder.itemView.setOnClickListener(this); holder.itemView.setOnLongClickListener(this); if (adapter != null) { int count = adapter.getItemCount(); if (position < count) { adapter.onBindViewHolder(holder, position); return; } } }
另外事件处理需要自定义
初来乍到,有写的不合理之处请多指正,具体简单实现见demo
- RecyclerView上拉加载与CoordinatorLayout
- RecyclerView上拉加载
- 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入
- RecyclerView完全解析之下拉刷新与上拉加载
- RecyclerView 上拉加载 PullToRefreshRecyclerView
- RecyclerView 上拉加载更多
- android RecyclerView上拉加载
- RecyclerView上拉加载Demo
- RecyclerView的上拉加载
- Android SwipeRefreshLayout+RecyclerView下拉刷新与上拉加载
- RecyclerView的上拉刷新与下拉加载
- RecyclerView的下拉刷新数据 与上拉加载更多
- Swiperefreshlayout与Recyclerview下拉刷新和上拉加载
- RecyclerView上拉刷新与下拉加载封装
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
- RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
- RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout
- java运算
- exe 与dll 进行通信 (消息事件)
- android simple animation dialog from bottom
- Day17:weekend
- 基于JMS代理的支持注解的远程方法调用
- RecyclerView上拉加载与CoordinatorLayout
- 编程练习四(并查集)
- 宽字节 转换 单字节
- equals比较与等值比较
- 第一次在这里写东西
- Android自定义属性详细剖析(一)
- ABI和ELF的全称?如何从elf文件生成bin文件?
- 小问题:linux下printf中标准输出显示问题
- String str1="abc";和String str2=new String("abc");的区别