android-ultra-pull-to-refresh list,Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

曹乐意
2023-12-01

一.gitHub地址及介绍

android-Ultra-Pull-To-Refresh (简称 UltraPTR )是一个强大的 Andriod 下拉刷新框架。

1.继承自ViewGroup,Content可以包含任何View;

2.简洁完善的Header抽象,方便进行扩展,构建满足需求的Header;

对比于Android-PullToRefresh 来说,UltraPTR没有实现上拉加载,作者认为上拉加载于下拉刷新不是同一个层次的功能,上拉加载应该交由Content自己去实现;Googgle官方的SwipeRefreshLayout也是这样认为的,对比SwipeRefreshLayout,UltraPTR更加灵活,更容易扩展。

UltraPTR首先抽象出两个接口,功能接口和UI接口

PtrHandler代表下拉刷新的功能接口,包含刷新功能回调方法以及判断是否可以下拉的方法,用户实现此接口来进行数据刷新工作。

PtrUIHandler代表下拉刷新的UI接口,包含准备下拉、下拉中、下拉完成、下拉重置以及下拉过程中的位置变化等回调方法。通常情况下,Header需要实现此接口,来处理下拉刷新过程中头部UI的变化。

整个项目围绕核心类PtrFrameLayout。

PtrFrameLayout代表了一个下拉刷新的自定义控件。

PtrFrameLayout继承自ViewGroup,有且只能有两个子View,头部Header和内容Content。通常情况下,Header会实现PtrUIHandler接口,Content可以为任意的View。

和所有的自定义控件一样,PtrFrameLayout通过重写onFinishInflate、onMeasure、onLayout来确定控件的大小和位置,通过重写dispatchTouchEvent来确定控件的下拉行为。

二.6个配置参数

1.阻尼系数:Resistance

//默认: 1.7f,越大,感觉下拉时越吃力。

2.触发刷新时移动的位置比例:RatioOfHeaderHeightToRefresh

//默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。

3.回弹延时:DurationToClose

//默认 200ms,回弹到刷新高度所用时间

4.头部回弹时间:DurationToCloseHeader

//默认1000ms

5.刷新是保持头部:KeepHeaderWhenRefresh

//默认值 true.

6.下拉刷新 / 释放刷新:PullToRefresh

//默认为释放刷新,默认false

xml文件中设置

android:id="@+id/ptrFragment"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:ptr_resistance="1.7"

app:ptr_ratio_of_header_height_to_refresh="1.2"

app:ptr_duration_to_close="300"

app:ptr_duration_to_close_header="300"

app:ptr_keep_header_when_refresh="true"

app:ptr_pull_to_fresh="false" >

android:id="@+id/store_house_ptr_image_content"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:clickable="true"

android:padding="10dp">

android:id="@+id/img"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:src="@mipmap/p5"

/>

java代码设置

ptrFrame.setResistance(1.7f);

ptrFrame.setRatioOfHeaderHeightToRefresh(1.2f);

ptrFrame.setDurationToClose(200);

ptrFrame.setDurationToCloseHeader(1000);

ptrFrame.setPullToRefresh(false);

ptrFrame.setKeepHeaderWhenRefresh(true);

三、头部风格

1.StoreHoseHeader

storeHouseHeader=new StoreHouseHeader(this);

storeHouseHeader.setBackgroundColor(Color.GRAY);

storeHouseHeader.setTextColor(Color.RED);

storeHouseHeader.setLineWidth(4);

storeHouseHeader.initWithString("update");

2. MeterialHeader

materialHeader = new MaterialHeader(this);

materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});

3.PtrClassicDefaultHeader

ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);

四、代码实战

xml文件:

android:layout_width="match_parent"

android:layout_height="match_parent"

xmlns:app="http://schemas.android.com/apk/res-auto"

>

android:id="@+id/ptrFragment"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:ptr_resistance="1.7"

app:ptr_ratio_of_header_height_to_refresh="1.2"

app:ptr_duration_to_close="300"

app:ptr_duration_to_close_header="300"

app:ptr_keep_header_when_refresh="true"

app:ptr_pull_to_fresh="false" >

android:id="@+id/store_house_ptr_image_content"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:clickable="true"

android:padding="10dp">

android:id="@+id/img"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:src="@mipmap/p5"

/>

2.activity

public class TestActivity extends BaseActivity {

private PtrFrameLayout ptrFrame;

private ImageView img;

private StoreHouseHeader storeHouseHeader;

private MaterialHeader materialHeader;

private PtrClassicDefaultHeader ptrClassicDefaultHeader;

@Override

protected void initView() {

ptrFrame=findViewById(R.id.ptrFragment);

img=findViewById(R.id.img);

initPtrFm();

}

private void initPtrFm() {

//1. 设置头部

initHeaders();

//2.添加头部

ptrFrame.setHeaderView(materialHeader);

//3.处理下拉刷新过程头部UI的变化

ptrFrame.addPtrUIHandler(materialHeader);

//4.判断是否可以下拉,数据刷新工作

ptrFrame.setPtrHandler(new PtrHandler() {

@Override

public void onRefreshBegin(PtrFrameLayout frame) {

frame.postDelayed(new Runnable() {

@Override

public void run() {

img.setImageResource(R.mipmap.p2);

ptrFrame.refreshComplete();

}

}, 3000);

}

@Override

public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {

// 默认实现,根据实际情况做改动

return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);

}

});

}

private void initHeaders() {

/**

* //第一种头部

* StoreHouse风格的头部实现

*/

storeHouseHeader=new StoreHouseHeader(this);

storeHouseHeader.setBackgroundColor(Color.GRAY);

storeHouseHeader.setTextColor(Color.RED);

storeHouseHeader.setLineWidth(4);

storeHouseHeader.initWithString("update");

// storeHouseHeader.initWithString("last updatetime "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

//"last update @" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())

/**

* //第二种头部

* Material Design风格的头部实现

*/

materialHeader = new MaterialHeader(this);

materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});//类似SwipeRefreshLayout

/**

* //第三种头部

* 经典 风格的头部实现

*/

ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);

}

@Override

protected void initData() {

}

@Override

protected int getLayoutId() {

return R.layout.activity_test;

}

}

 类似资料: