自定义ListView下拉刷新上拉加载更多

  • 自定义ListView下拉刷新上拉加载更多
  • 自定义RecyclerView下拉刷新上拉加载更多
Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时代的意义,拓展性很强,我们可以自己添加下拉刷新,上拉加载更多功能 。他和recycleview不同,他生来具有addHeaderView和addFooterView的功能 , 这也导致同样都是列表控件,实现上拉下拉的方式缺截然不同 。
效果图
自定义ListView下拉刷新上拉加载更多

文章插图
自定义ListView下拉刷新上拉加载更多

文章插图
1、创建刷新控件public class MyListview extends ListView {public MyListview(Context context) {this(context,null);}public MyListview(Context context, AttributeSet attrs) {this(context,attrs,0);}public MyListview(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}public void init(Context context) {}1.1、创建头部View头部样式,我写的是最简单的,根据业务需求来定,下拉的时候无非就是几种
  • 产品logo作为箭头转动的icon
  • 添加刷新时间
  • 加入其他具有特色的动效

自定义ListView下拉刷新上拉加载更多

文章插图
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center"tools:ignore="MissingDefaultResource"><ProgressBarandroid:layout_width="20dp"android:layout_height="match_parent"style="?android:attr/progressBarStyle"android:layout_marginEnd="10dp"android:indeterminateTint="#E8AD56"/><TextViewandroid:id="@+id/header_text"android:layout_width="wrap_content"android:layout_height="50dp"android:text="我是头部"android:gravity="center"android:textColor="#E8AD56"/></LinearLayout>样式写好后 , 我们需要添加到我们控件中,addHeaderView就起到作用了
public void init(Context context) {//添加头部viewHeader = View.inflate(context, R.layout.view_header, null);viewHeader.measure(0, 0);//让系统自动检测头部高度heightHeader = viewHeader.getMeasuredHeight();header_text = viewHeader.findViewById(R.id.header_text);viewHeader.setPadding(0, -heightHeader, 0, 0);this.addHeaderView(viewHeader);}一些控件我定义成全局的是因为下面会用到 。setPadding可以设置显示位置,左上右下,上为负数就是隐藏在顶部 。我们需要手指下拉去控制他缓慢显示,就用到了OnTouchListener,我们实现OnTouch方法做一些事件的分发处理 。
1.2、下拉事件public class MyListview extends ListView implements View.OnTouchListener{@Overridepublic boolean onTouch(View v, MotionEvent event) {return false;}public void init(Context context){setOnTouchListener(this);}}注意:别忘记了setOnTouchListener在init中添加
这时候我们需要对event的down,move,up事件进行逻辑处理,当手指按在屏幕时会触发事件,一个down事件,0~无数次move事件,一个up事件,这里面着重对move事件做处理,我们记录一下down事件的Y,因为是上下拉动,没必要计算X 。然后diffY就是手指滑动的距离,我们需要处理一下这个值,因为值太大,而且值是整数,会让我们下拉的时候产生错乱,我们本意是让其从-100到0缓慢滑出(比如头部高度是100,从隐藏到显示就是-100到0),小伙伴都可以试试viewHeader.setPadding(0, diffY, 0, 0);和viewHeader.setPadding(0, paddY, 0, 0);效果是不一样的,diff/3是让其有种阻尼的感觉,不然的话会很块就被拉出来了 。还有事件消费的话一定要return true 。
@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downY = (int) event.getY();break;case MotionEvent.ACTION_MOVE:moveY = (int) event.getY();diffY = moveY - downY;//滑动的距离paddY = - heightHeader + diffY / 3;viewHeader.setPadding(0, paddY, 0, 0);return true;//break;case MotionEvent.ACTION_UP:break;}return false;}我们下面要做下拉时给人的反馈,我们下拉时有3种状态分别是
  • 开始刷新  (下拉距离不超过100)
  • 释放刷新   (下拉距离超过100)
  • 刷新中    (手指释放,up事件处理)

自定义ListView下拉刷新上拉加载更多

文章插图

推荐阅读