android 滑动刷新的实验总结
实验背景介绍:
数据的存储、操作和展示由SQLite、Cursor、CursorAdapter、ListView完成。
为了直观显示,放置2个TextView作为反馈提示。界面如下。
详细代码就不在这浪费页面了。重点说如何实现滑动刷新的原理和实验总结。
很多人都是通过对比触摸的坐标,或者首条记录的值得变化 来判断方向。这里我用另外的思路来考虑。
ListView在更新了界面后,有4种可能的情况(姑且认为是 内容滑动 的结果):
1、记录不满一屏。(两种情况:数据库里的记录少于一页,或者是最后一页;每页数据少于一屏。)
2、记录超过一屏,并且显示了记录的起始部分。
3、记录超过一屏,并且显示了记录的中间部分。
3、记录超过一屏,并且显示了当前页 记录的末尾部分。
在分清楚了上述状态后,再结合 手势滑动 的状态 做出是否需要翻页的决定。数据库分页操作部分就不讲了。
覆写ListVIew的这个方法
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int ScrollState) {
}
@Override
public void onScroll(AbsListView absListView,int firstVisibleItem,int visibleItemCount,int totalItemCount) {
/**
* firstVisibleItem 表示在当前屏幕显示的第一个listItem在整个listView里面的位置(下标从0开始)
* visibleItemCount 表示在现时屏幕可见到的ListItem(部分显示的ListItem也算)总数
* totalItemCount 表示ListView的ListItem总数
* listView.getLastVisiblePosition() 表示在现时屏幕最后一个ListItem
* (最后ListItem要完全显示出来才算)在整个ListView的位置(下标从0开始)
*/
//判断是否在listView的末尾(行号从零开始):(屏显首行号+屏显数量)?总数量
}
});
通过onScroll判断4种情况。定义一个全局 int 变量,默认值,代表情况三。(这个情况不需要翻页)
if(
visibleItemCount ==totalItemCount){
//记录不满一屏
}else{
if(firstVisibleItem==0){
//页首
}
if(firstVisibleItem+visibleItemCount==totalItemCount){
//页末
}
}
触摸的判断,先说一个不推荐的实验结论
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) { } } );
这个方法的缺点是,在滑动中,按照时间间隔,多次反馈。另外也发现,点击Item时,也是可以监测到的。就是功能多,且繁琐。
对比起来 onScrollStateChanged 就好多了。只有3种状态,滑动过程只算一次动作。
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
// datastate=; //1,all;2,start;3,end;
int scroll_times =0; //用于观察滑动是否有反馈。
@Override
public void onScrollStateChanged(AbsListView absListView, int ScrollState) {
switch (ScrollState){
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE :
//
scroll_time++;
datatitle.setText("SCROLL_STATE_IDLE "+scroll_end);
Log.d(TAG, "onScrollStateChanged: SCROLL_STATE_IDLE"+scroll_times);
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
//
if(scroll_time>3){
scroll_time=0;
}
Log.d(TAG, "onScrollStateChanged: TOUCH_SCROLL "+scroll_times);
break;
}
}
在试验中发现,记录少于屏幕(情况一)的时候,必须在有数据的地方滑动,会改变计数器的值。(具体操作时,结合数据库的分页情况决定是否上翻页或者下翻页 了。)
虽然没有给出最终代码,如果理解了这个道理,应该可以写出完整代码的。
补充:
图片中显示的编号是数据库中的主键编号。
SQLite的主键编号,貌似从1开始。
ListView中会给每行记录另外分配行号,从0开始。
也许很多人没注意到,对于onScrollStateChanged ,只有触摸在Item上时,才有意义。也就解释了为什么数据少的时候,只有下拉滑动有效。当然了,ListView中没有数据,或者在其空白地触摸,是没有反馈的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话