下拉刷新上拉加载RecycleView效果出众
来源:互联网 发布:室内网络布线 编辑:程序博客网 时间:2024/05/16 17:20
基本使用
- 适配material design Android5.0后新增NestedScroll接口RefreshNLoadMoreNestedLayout(适用于CoordinatorLayout)
- 普通使用RefreshNLoadMoreRecyclerView
RefreshNLoadMoreNestedLayout
基本使用
在xml中
<android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="0dp" app:expandedTitleMarginEnd="0dp" app:expandedTitleMarginStart="0dp" app:layout_scrollFlags="scroll"> <TextView android:layout_width="match_parent" android:layout_height="200dp" android:background="#ffffff" android:gravity="center" android:text="测试" android:textSize="25dp" /> </android.support.design.widget.CollapsingToolbarLayout> <TextView android:layout_width="match_parent" android:layout_height="40dp" android:background="#f5f566" /> </android.support.design.widget.AppBarLayout> <sunsh.customview.refreshview.hfrvnested.RefreshNLoadNestedLayout android:id="@+id/refresh_loadmore_layout" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> </android.support.design.widget.CoordinatorLayout>
在activity中
class Main2Activity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2) startActivity(Intent(this,Main22Activity::class.java)) val recyclerView = refresh_loadmore_layout.basseRV recyclerView.layoutManager = PTLLinearLayoutManager() val strings = ArrayList<String>() for (i in 0..4) { strings.add(i.toString() + "") } recyclerView.adapter = MyAdapter(this, strings, R.layout.item) recyclerView.setOnRefreshListener { recyclerView.postDelayed({ recyclerView.completeRefresh() val textView = TextView(this@Main2Activity) textView.layoutParams = ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80) textView.setBackgroundColor(Color.parseColor("#ff0000")) textView.text = "加一个头部" textView.gravity = Gravity.CENTER recyclerView.addHeaderView(textView) }, 3000) } recyclerView.setOnLoadListener { recyclerView.postDelayed({ recyclerView.completeLoad() val textView = TextView(this@Main2Activity) textView.layoutParams = ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80) textView.setBackgroundColor(Color.parseColor("#ff0000")) textView.text = "加一个尾部" textView.gravity = Gravity.CENTER recyclerView.addFooterView(textView) }, 3000) } } internal inner class MyAdapter(context: Context, datas: ArrayList<String>, layoutId: Int) : SimpleAdapter<String>(context, datas, layoutId) { override fun onBindViewHolder(holder: ViewHolder, data: String) { val view = holder.getView<TextView>(R.id.tv) view.text = data } }}
效果
下拉
上拉
1).封装包中除了这两个还有其他几个使用基本类似不做一一介绍,RefreshNAutoLoadMoreNestedLayout、RefreshNAutoLoadMoreRecyclerView以及修改系统SwipeRefreshLayout 支持上拉效果的SwipeRefreshLayout(上拉效果与下拉一致)
2) 刷新实现方式实际是添加两个itemtype head 跟 foot 计算position时注意减去head数与listview类似,LayoutManger需使PTLLinearLayoutManager与PTLGridLayoutManager 二者根本为StaggeredGridLayoutManager,所以使用瀑布流时不变。
3)新增加的四个刷新控件均支持自定义上下拉样式setRefreshViewCreator(RefreshHeaderCreator),setLoadViewCreator(LoadFooterCreator),具体使用如下
RefreshNLoadMoreRecyclerView
基本使用
在xml中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main22" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.jimi_wu.ptlrecyclerviewsample.Main22Activity"> <sunsh.customview.refreshview.RefreshNLoadRecyclerView android:id="@+id/refresh_loadmore_recycler" android:layout_width="match_parent" android:layout_height="match_parent"> </sunsh.customview.refreshview.RefreshNLoadRecyclerView></RelativeLayout>
在activity中 使用基本与RefreshNLoadMoreNestedLayout一致,只是不需要在获取一个recyclerview RefreshNLoadMoreRecyclerView本身就是个recyclerview
class Main22Activity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main22) val strings = ArrayList<String>() for (i in 0..14) { strings.add(i.toString() + "") } refresh_loadmore_recycler.adapter = MyAdapter(this,strings,R.layout.item) refresh_loadmore_recycler.layoutManager = PTLLinearLayoutManager() refresh_loadmore_recycler.setOnRefreshListener { refresh_loadmore_recycler.postDelayed({ refresh_loadmore_recycler.completeRefresh() val textView = TextView(this@Main22Activity) textView.layoutParams = ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 80) textView.setBackgroundColor(Color.parseColor("#ff0000")) textView.text = "加一个头部" textView.gravity = Gravity.CENTER refresh_loadmore_recycler.addHeaderView(textView) }, 3000) } refresh_loadmore_recycler.setOnLoadListener { refresh_loadmore_recycler.postDelayed({ strings.add("+1") strings.add("+2") strings.add("+3") refresh_loadmore_recycler.completeLoad() }, 3000) } } internal inner class MyAdapter(context: Context, datas: ArrayList<String>, layoutId: Int) : SimpleAdapter<String>(context, datas, layoutId) { override fun onBindViewHolder(holder: ViewHolder, data: String) { val view = holder.getView<TextView>(R.id.tv) view.text = data } }}
效果
下拉
上拉
1).封装包中除了这两个还有其他几个使用基本类似不做一一介绍,RefreshNAutoLoadMoreNestedLayout、RefreshNAutoLoadMoreRecyclerView以及修改系统SwipeRefreshLayout 支持上拉效果的SwipeRefreshLayout(上拉效果与下拉一致)
2)新增加的四个刷新控件均支持自定义上下拉样式setRefreshViewCreator(RefreshHeaderCreator),setLoadViewCreator(LoadFooterCreator),具体使用如下
/** * Created by sunsh on 2017/9/28. */public class DefaultRefreshHeaderCreator extends RefreshHeaderCreator { private View mRefreshView; private ImageView iv; private TextView tv; private int rotationDuration = 200; private int loadingDuration = 1000; private ValueAnimator ivAnim; @Override public boolean onStartPull(float distance,int lastState) { if (lastState == PullToRefreshRecyclerView.STATE_DEFAULT ) { iv.setImageResource(R.drawable.arrow_down); iv.setRotation(0f); tv.setText("下拉刷新"); } else if (lastState == PullToRefreshRecyclerView.STATE_RELEASE_TO_REFRESH) { startArrowAnim(0); tv.setText("下拉刷新"); } return true; } @Override public void onStopRefresh() { if (ivAnim != null) { ivAnim.cancel(); } } @Override public boolean onReleaseToRefresh(float distance,int lastState) { if (lastState == PullToRefreshRecyclerView.STATE_DEFAULT ) { iv.setImageResource(R.drawable.arrow_down); iv.setRotation(-180f); tv.setText("松手立即刷新"); } else if (lastState == PullToRefreshRecyclerView.STATE_PULLING) { startArrowAnim(-180f); tv.setText("松手立即刷新"); } return true; } @Override public void onStartRefreshing() { iv.setImageResource(R.drawable.loading); startLoadingAnim(); tv.setText("正在刷新..."); } @Override public View getRefreshView(Context context, RecyclerView recyclerView) { mRefreshView = LayoutInflater.from(context).inflate(R.layout.layout_ptr_ptl,recyclerView,false); iv = (ImageView) mRefreshView.findViewById(R.id.iv); tv = (TextView) mRefreshView.findViewById(R.id.tv); return mRefreshView; } private void startArrowAnim(float roration) { if (ivAnim != null) { ivAnim.cancel(); } float startRotation = iv.getRotation(); ivAnim = ObjectAnimator.ofFloat(startRotation,roration).setDuration(rotationDuration); ivAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { iv.setRotation((Float) animation.getAnimatedValue()); } }); ivAnim.start(); } private void startLoadingAnim() { if (ivAnim != null) { ivAnim.cancel(); } ivAnim = ObjectAnimator.ofFloat(0,360).setDuration(loadingDuration); ivAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { iv.setRotation((Float) animation.getAnimatedValue()); } }); ivAnim.setRepeatMode(ObjectAnimator.RESTART); ivAnim.setRepeatCount(ObjectAnimator.INFINITE); ivAnim.setInterpolator(new LinearInterpolator()); ivAnim.start(); }}
上拉样式与下拉一样继承LoadFooterCreator,不列出了
还不会做gif,先凑合静态图吧,等我学会了再配gif上来吧。
AndroidStudio 配置Project Gradle添加jitpack仓库
allprojects { repositories { jcenter() maven { url 'https://jitpack.io' } }}
在项目Module Gradle 中添加依赖
compile 'com.github.sunshaobei:Refreshview:3.9'
- 谢谢观看,不令赐教
github源码地址https://github.com/sunshaobei/Refreshview/blob/master/README.md
阅读全文
0 0
- 下拉刷新上拉加载RecycleView效果出众
- RecycleView上拉加载和下拉刷新
- RecycleView下拉刷新上拉加载
- recycleView下拉刷新上拉加载
- RecycleView上拉刷新下拉加载
- recycleView的使用以及PullableRecyclerView实现了上拉加载下拉刷新的效果
- RecycleView 上拉加载下拉刷新 分页加载
- 自定义下拉刷新和上拉加载的recycleview
- 使用SwipeRefreshLayout实现recycleview下拉刷新上拉加载
- RecycleView上拉加载和下拉刷新二
- 【实训】自定义上拉加载下拉刷新的RecycleView
- SwipeRefreshLayout +RecycleView实现上拉加载更多和下拉刷新
- Recycleview下拉刷新,上拉加载的思路
- pullloadmorerecyclerview实现recycleview上拉加载,下拉刷新
- Recycleview的上拉刷新与下拉加载
- SwipeRefreshLayout+RecycleView实现下拉刷新上拉加载
- 下拉刷新 上拉加载的 ListView RecycleView ScorllView
- RecycleView添加下拉刷新、上拉加载更多
- leetcode练习 Task Scheduler
- 协程设计需要注意的两个小问题及解决
- 自己喜欢的句子总结一
- 源码分析继承Thread和实现Runnable来创建线程
- 利用精巧的Bat程序,破解某一思维导图Pro版
- 下拉刷新上拉加载RecycleView效果出众
- 明日(2017.10.30)待整理的文件
- android studio自动整理代码快捷键
- Android文件打开方式,获取相对应type,万能
- Python 习题里程碑
- 【Java】NIO 客户端-服务器 聊天 例子
- Python-------字符串操作
- 杭电oj
- 百度:缩水90亿后,AI商业化能否扭转逆势?