zoukankan      html  css  js  c++  java
  • SwipeRefreshLayout和RecyclerView类

    1 SwipeRefreshLayout和RecyclerView之间的关系

    内容栏上下滚动是RecyclerView控制的,只有当内容栏滑动到最顶上时,再也拉不动了的时候,这个时候将动作交给SwipeRefreshLayout执行刷新操作。

    也就是说,滚动事件是RecyclerView的事件,由RecyclerView的listener负责处理,只有当RecyclerView往下滚动不了了的时候才交给SwipeRefreshLayout去处理。

    2 关于SwipeRefreshLayout

    这是一个特殊的ViewGroup,它只能有一个孩子,并且这个孩子必须是实现ScrollingView的。

    一旦用户在屏幕上上下滑动或者左右滑动就会触发OnRefreshListener。

    SwipeRefreshLayout是一个widget,因此它有自己的显示,即那个转圈。并且

    3 关于RecyclerView

    RecyclerView实现了ScrollingView,它用于大量数据的滑动列表的显示。

    4 它们都是ViewGroup

    因为它们都是ViewGroup,因此它们是不会有显示的。

    5 下拉刷新的圈

     将一个RecyclerView作为SwipeRefreshLayout的孩子即可,在转圈的时候,不会影响RecyclerView的显示。RecyclerView中显示的数据,让它的adapter提供就可以了。

    这个圈可以自己设置的吗?

    setColorSchemeResources,设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色。

    5 上拉加载更多的“更多加载中”

    上拉加载更多的“更多加载中”需要自己实现。

    6 下拉刷新的使用

    第一,设置布局

    SwipeRefreshLayout只能有一个孩子,比如包裹一个ListView;

    第二,在代码中使用SwipeRefreshLayout

    // 设置颜色属性的时候一定要注意是引用了资源文件还是直接设置16进制的颜色,因为都是int值容易搞混
      // 设置下拉进度的背景颜色,默认就是白色的
      swipeRefreshView.setProgressBackgroundColorSchemeResource(android.R.color.white);
      // 设置下拉进度的主题颜色
      swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
    
      // 下拉时触发SwipeRefreshLayout的下拉动画,动画完毕之后就会回调这个方法
      swipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
          @Override
          public void onRefresh() {
    
              // 开始刷新,设置当前为刷新状态
              //swipeRefreshLayout.setRefreshing(true);
    
              // 这里是主线程
              // 一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行
              // TODO 获取数据
              final Random random = new Random();
              new Handler().postDelayed(new Runnable() {
                  @Override
                  public void run() {
                      mList.add(0, "我是天才" + random.nextInt(100) + "号");
                      mAdapter.notifyDataSetChanged();
    
                      Toast.makeText(MainActivity.this, "刷新了一条数据", Toast.LENGTH_SHORT).show();
    
                      // 加载完数据设置为不刷新状态,将下拉进度收起来
                      swipeRefreshView.setRefreshing(false);
                  }
              }, 1200);
    
              // System.out.println(Thread.currentThread().getName());
    
              // 这个不能写在外边,不然会直接收起来
              //swipeRefreshLayout.setRefreshing(false);
          }
      });
    adapter的数据更新之后,调用mAdapter.notifyDataSetChanged();,迫使RecyclerView更新每个items的内容。

    7 自己实现上拉加载更多

    第一,监听当前的ListView已经加载完了,然后就触发ListView的addFooterView来显示“更多加载中”,并且加载更多的数据,这个地方涉及到ListView的Adapter。

    然后更多的数据加载了,并且显示在ListView的后面了;

    第二,还需要父View的SwipeRefreshLayout的配合,因为上拉事件是它的。

    8 SwipeRefreshLayout的setRefreshing(boolean refreshing)方法

    这个接口触发和关闭刷新进度圈的显示,当refreshing为true的时候,刷新进度圈显示,当refreshing为false的时候,刷新进度圈停止显示。

    实现首次进入自动刷新,

    方法一:

    ①在onWindowFocusChanged()方法中,设置为刷新状态为true

    @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            mSwipeRefreshLayout.setRefreshing(true);
        }

    ②在获取数据完成后设置刷新状态为false

    if (mSwipeRefreshLayout.isRefreshing()) {
                                mSwipeRefreshLayout.setRefreshing(false);
                            }


    方法二:

    ①调用mSwipeRefreshLayout.measure()方法后,设置刷新状态为true

    //手动调用,通知系统去测量
            mSwipeRefreshLayout.measure(0,0);
            mSwipeRefreshLayout.setRefreshing(true);

    ②在获取数据完成后设置刷新状态为false

    if (mSwipeRefreshLayout.isRefreshing()) {
                                mSwipeRefreshLayout.setRefreshing(false);
                            }

    在SwipeRefreshLayout绘制完成之后,再设置刷新状态为true,否则大多数情况下,SwipeRefreshLayout刷新球会不显示。

    参考资料:

    https://www.jianshu.com/p/d23b42b6360b

  • 相关阅读:
    shell cut
    查询表名
    RandomAccessFile
    eclipse 背景颜色
    JAVA 获取分行符
    date time insert
    shell date time
    python
    gdg shell
    shell入门之变量测试
  • 原文地址:https://www.cnblogs.com/hustdc/p/11437431.html
Copyright © 2011-2022 走看看