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中没有数据,或者在其空白地触摸,是没有反馈的。

转载于:https://www.cnblogs.com/htsky/p/6438442.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值