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

  • 相关阅读:
    企业信息开发平台(5)流程设计(一)
    企业信息开发平台(6)Web表单设计器开源
    Guava的常用方法示例
    apk反编译
    公司注册登记流程
    Git 使用流程
    ZIP压缩和解压字符串
    vue+elementui实现无限级动态菜单树
    vue 开发笔记
    从零到一开发博客后台管理系统(一)
  • 原文地址:https://www.cnblogs.com/htsky/p/6438442.html
Copyright © 2020-2023  润新知