- 在很多软件中,我们会用到上拉刷新,同时大多也会有下拉加载的功能,PullToRefresh这个控件就可以帮我们实现这个效果。
- 要使用这个空间首先我们要导包
布局文件
- 布局文件中就是添加了一个最简单的PullToRefreshListView
<?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="match_parent"
android:orientation="vertical"
tools:context="com.lingzhuo.testfrash.MainActivity">
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/pullToRefreshListView"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>
逻辑代码
public class MainActivity extends AppCompatActivity {
private PullToRefreshListView pullToRefreshListView;
private List<String> dataList;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
MyAdapter adapter = new MyAdapter(dataList, getApplicationContext());
pullToRefreshListView.setAdapter(adapter);
/**
* * 设置PullToRefresh刷新模式
* BOTH:上拉刷新和下拉刷新都支持
* DISABLED:禁用上拉下拉刷新
* PULL_FROM_START:仅支持下拉刷新(默认)
* PULL_FROM_END:仅支持上拉刷新
* MANUAL_REFRESH_ONLY:只允许手动触发
*/
pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
pullToRefreshListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
//在这里我通过判断滑动事件中第一个可见的item来区分当前是上拉还是下拉事件,同时设置的刷新的提示的文字内容,这样设置有一定缺陷,下面我会在详细解释,至于为什么下面的监听已经实现了上拉和下拉的区分,你自己不加这个判断多拉几次就会发现问题了
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem==0){
//设置刷新标签
pullToRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在刷新");
//设置下拉标签
pullToRefreshListView.getLoadingLayoutProxy().setPullLabel("下拉刷新");
//设置释放标签
pullToRefreshListView.getLoadingLayoutProxy().setReleaseLabel("释放立即刷新");
}else{
//设置刷新标签
pullToRefreshListView.getLoadingLayoutProxy().setRefreshingLabel("正在加载...");
//设置下拉标签
pullToRefreshListView.getLoadingLayoutProxy().setPullLabel("加载更多...");
//设置释放标签
pullToRefreshListView.getLoadingLayoutProxy().setReleaseLabel("加载更多...");
}
}
});
// 设置刷新监听
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
//设置上一次刷新的提示标签
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" +new SimpleDateFormat("hh:mm:ss").format(System.currentTimeMillis()));
for (int i = 0; i < 10; i++) {
dataList.add("下拉加载" + i);
}
pullToRefreshListView.postDelayed(new Runnable() {
@Override
public void run() {
pullToRefreshListView.onRefreshComplete();
}
},1000);
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
//设置上一次刷新的提示标签
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后更新时间:" +new SimpleDateFormat("hh:mm:ss").format(System.currentTimeMillis()));
pullToRefreshListView.postDelayed(new Runnable() {
@Override
public void run() {
pullToRefreshListView.onRefreshComplete();
}
},1000);
}
});
}
private void init() {
pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
dataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
dataList.add("这是一条新数据" + i);
}
}
}
- 当数据更新之后,必须调用这句代码 pullToRefreshListView.onRefreshComplete();
- 但是我却是这么实现的
pullToRefreshListView.postDelayed(new Runnable() {
@Override
public void run() {
pullToRefreshListView.onRefreshComplete();
}
},1000);
- 因为PullToRefreshListView 实现下拉或者上拉加载时候,可能在上拉 完成时候,调用onRefreshComplete方法去停止 刷新操作,但是,可能无效,测试产生原因,刷新获取数据时候,时间太短,就会出现该问题
- 我们可以 延迟 1秒左右,在调用onRefreshComplete 方法,可以解决该问题
mListView.postDelayed(new Runnable() {
@Override
public void run() {
mListView.onRefreshComplete();
}
}, 1000);
- 记得是在 setadpter后面执行,不然 无效
- 其实这里我们不必太在意,以为我只是写demo,真正使用这个框架的时候,我们一般都是从网上去获取数据来加载显示,一般都会有一定的延时的。
- 我对上拉还是下拉的判断是基于当前显示第一个item是否是列表的第一个item为基准的,这就导致,当我们第一页未填满,也就是列表第一个item显示的时候,同时我们当前列表第一项就是第一个item的时候,下拉显示的提示文字,还是和上拉显示一样的文字。
- 这里我在网上看到有人修改源码来实现区分上拉还是下拉,可能是我太菜了,不知道咋导入第三方的library,试了半天也没成功,汗!!!如果大家有兴趣的话,可以试试这个博主的改源码的方法,如果成功了记得留言教教我,谢谢。
时间: 2024-10-10 10:10:29