android 刷新layout,Android一步步实现一个下拉刷新——RefreshLayout

本文详细介绍了如何在Android中自定义一个RefreshLayout,实现下拉刷新的功能。通过创建一个继承自LinearLayout的RefreshLayout,并添加ProgressBar,利用onLayout()、onInterceptTouchEvent()和onTouchEvent()方法来处理滑动事件,实现下拉隐藏和弹性滑动效果。同时,还考虑了适配ScrollView和RecyclerView的情况,使得下拉刷新功能可在多种滚动视图中正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图

f33d16cba603fd6ff514b98149b2cf21.gif

ScreenGif1.gif

实现流程

新建一个RefreshLayout继承自Linearlayout。

public class RefreshLayout extends LinearLayout

添加一个progressbar到RefreshLayout中,作为第一个View。 public RefreshLayout(Context context) {

super(context);

init();

}

public RefreshLayout(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

init();

}

public RefreshLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

private void init() {

addHeadRefresh();

}

private void addHeadRefresh() {

setOrientation(LinearLayout.VERTICAL);

ProgressBar progressBar = new ProgressBar(getContext());

addView(progressBar, 0);

}复制代码

通过scroll隐藏progerssbar。@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

scrollTo(0, getChildAt(0).getHeight());

}复制代码

重写onInterfuptTouchEvent()方法,判断下滑时候拦截事件@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

y = (int) ev.getRawY();

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

interrupt = false;

break;

case MotionEvent.ACTION_MOVE:

if (y - yLast > 2) {

interrupt = true;

} else {

interrupt = false;

}

break;

case MotionEvent.ACTION_UP:

interrupt = false;

break;

}

yLast = y;

return interrupt;

}复制代码

重写onTouchEvent()方法,处理滑动以及弹性滑动@Override

public boolean onTouchEvent(MotionEvent event) {

//动画还没结束的时候,直接消耗掉事件,不处理。

if (!scroller.isFinished()||isRefresh) {

return true;

}

y = (int) event.getY();

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

yMove = y - yLast;

if (yMove >= 0) {

scrollBy(0, -yMove / 3); // /3为了让下拉有感觉

i += yMove / 3;

}

break;

case MotionEvent.ACTION_UP:

if(i>=getChildAt(0).getHeight()){

smoothToScroll(i-getChildAt(0).getHeight());

i = getChildAt(0).getHeight();

isRefresh = true;

Toast.makeText(getContext(),"正在刷新中",Toast.LENGTH_SHORT).show();

}else {

endRefresh();

}

break;

}

yLast = y;

return true;

}复制代码

实现弹性滑动典型固定代码 private void smoothToScroll(int destaY) {

scroller.startScroll(0, getScrollY(), 0, destaY, 500);

invalidate();

}

@Override

public void computeScroll() {

super.computeScroll();

if (scroller.computeScrollOffset()) {

scrollTo(0, scroller.getCurrY());

postInvalidate();

}

}复制代码

增加结束滑动方法 public void endRefresh() {

isRefresh = false;

smoothToScroll(i);

i = 0;

}复制代码

第一阶段全部代码如下 public class RefreshLayout extends Li

基于SwipeRefreshLayout下拉刷新、上拉加载。支持所有的AbsListView、RecycleView 特点  在 layout 中使用,支持 AbsListView 所有的xml属性  支持自动下拉刷新,什么用呢?比如进入界面时,只需要调用 autoRefresh() 方法即可,同时下拉刷新回调函数将会被调用。  上拉加载支持自定义 View 或设置加载文字、动画  轻松设置 Adapter 空数据视图,默认为 TextView 支持更文字,也可自定义 View  对于简单的界面,如只有 ListView 可以继承 app 包中 Fragment 轻松搞定 效果图 使用 仔细看 listSelector 属性,效果见 sample <com.mylhyl.prlayout.SwipeRefreshListView xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@ id/swipeRefresh"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:listSelector="@drawable/selector_list"     tools:context=".app.ListViewXmlFragment" /> 设置上拉加载,更多方法见 IFooterLayout         IFooterLayout footerLayout = swipeRefreshListView.getFooterLayout();         footerLayout.setFooterText("set自定义加载");         footerLayout.setIndeterminateDrawable(getResources().getDrawable(R.drawable.footer_progressbar)); 自定义adapter空数据视图         ImageView emptyView = new ImageView(getContext());         emptyView.setImageResource(R.mipmap.empty);         swipeRefreshGridView.setEmptyView(emptyView); 或         swipeRefreshListView.setEmptyText("数据呢?"); 使用Gradle构建时添加一下依赖即可: compile 'com.mylhyl:pullrefreshlayout:1.0.0' QQ交流群:435173211
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值