• Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用


    一.gitHub地址及介绍

    https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh

    android-Ultra-Pull-To-Refresh (简称 UltraPTR )是一个强大的 Andriod 下拉刷新框架。 
    1.继承自ViewGroup,Content可以包含任何View; 
    2.简洁完善的Header抽象,方便进行扩展,构建满足需求的Header;
    
    对比于Android-PullToRefresh 来说,UltraPTR没有实现上拉加载,作者认为上拉加载于下拉刷新不是同一个层次的功能,上拉加载应该交由Content自己去实现;Googgle官方的SwipeRefreshLayout也是这样认为的,对比SwipeRefreshLayout,UltraPTR更加灵活,更容易扩展。
    
    UltraPTR首先抽象出两个接口,功能接口和UI接口 
    PtrHandler代表下拉刷新的功能接口,包含刷新功能回调方法以及判断是否可以下拉的方法,用户实现此接口来进行数据刷新工作。 
    PtrUIHandler代表下拉刷新的UI接口,包含准备下拉、下拉中、下拉完成、下拉重置以及下拉过程中的位置变化等回调方法。通常情况下,Header需要实现此接口,来处理下拉刷新过程中头部UI的变化。
    
    整个项目围绕核心类PtrFrameLayout。 
    PtrFrameLayout代表了一个下拉刷新的自定义控件。 
    PtrFrameLayout继承自ViewGroup,有且只能有两个子View,头部Header和内容Content。通常情况下,Header会实现PtrUIHandler接口,Content可以为任意的View。 
    和所有的自定义控件一样,PtrFrameLayout通过重写onFinishInflate、onMeasure、onLayout来确定控件的大小和位置,通过重写dispatchTouchEvent来确定控件的下拉行为。
    

      

    二.6个配置参数

    1.阻尼系数:Resistance
    //默认: 1.7f,越大,感觉下拉时越吃力。

    2.触发刷新时移动的位置比例:RatioOfHeaderHeightToRefresh
    //默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。

    3.回弹延时:DurationToClose
    //默认 200ms,回弹到刷新高度所用时间

    4.头部回弹时间:DurationToCloseHeader
    //默认1000ms

    5.刷新是保持头部:KeepHeaderWhenRefresh
    //默认值 true.

    6.下拉刷新 / 释放刷新:PullToRefresh

    //默认为释放刷新,默认false 

    xml文件中设置

    <in.srain.cube.views.ptr.PtrFrameLayout
            android:id="@+id/ptrFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:ptr_resistance="1.7"
            app:ptr_ratio_of_header_height_to_refresh="1.2"
            app:ptr_duration_to_close="300"
            app:ptr_duration_to_close_header="300"
            app:ptr_keep_header_when_refresh="true"
            app:ptr_pull_to_fresh="false" >
    
            <LinearLayout
                android:id="@+id/store_house_ptr_image_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clickable="true"
                android:padding="10dp">
    
                <ImageView
                    android:id="@+id/img"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:src="@mipmap/p5"
                    />
            </LinearLayout>
    
        </in.srain.cube.views.ptr.PtrFrameLayout>
    

    java代码设置

            ptrFrame.setResistance(1.7f);
            ptrFrame.setRatioOfHeaderHeightToRefresh(1.2f);
            ptrFrame.setDurationToClose(200);
            ptrFrame.setDurationToCloseHeader(1000);
            ptrFrame.setPullToRefresh(false);
            ptrFrame.setKeepHeaderWhenRefresh(true);
    

      

     三、头部风格

    1.StoreHoseHeader

            storeHouseHeader=new StoreHouseHeader(this);
            storeHouseHeader.setBackgroundColor(Color.GRAY);
            storeHouseHeader.setTextColor(Color.RED);
            storeHouseHeader.setLineWidth(4);
            storeHouseHeader.initWithString("update");
    

      

    2. MeterialHeader

     materialHeader = new MaterialHeader(this);
     materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});
    

      

    3.PtrClassicDefaultHeader

     ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);
    

    四、代码实战

     xml文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        >
    
        <in.srain.cube.views.ptr.PtrFrameLayout
            android:id="@+id/ptrFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:ptr_resistance="1.7"
            app:ptr_ratio_of_header_height_to_refresh="1.2"
            app:ptr_duration_to_close="300"
            app:ptr_duration_to_close_header="300"
            app:ptr_keep_header_when_refresh="true"
            app:ptr_pull_to_fresh="false" >
    
            <LinearLayout
                android:id="@+id/store_house_ptr_image_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clickable="true"
                android:padding="10dp">
    
                <ImageView
                    android:id="@+id/img"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:src="@mipmap/p5"
                    />
            </LinearLayout>
    
        </in.srain.cube.views.ptr.PtrFrameLayout>
    </RelativeLayout>
    

      2.activity

    public class TestActivity extends BaseActivity {
    
        private PtrFrameLayout ptrFrame;
        private ImageView img;
        private StoreHouseHeader storeHouseHeader;
        private MaterialHeader materialHeader;
        private PtrClassicDefaultHeader ptrClassicDefaultHeader;
        @Override
        protected void initView() {
            ptrFrame=findViewById(R.id.ptrFragment);
            img=findViewById(R.id.img);
            initPtrFm();
        }
    
        private void initPtrFm() {
    
    
            //1. 设置头部
            initHeaders();
            //2.添加头部
            ptrFrame.setHeaderView(materialHeader);
            //3.处理下拉刷新过程头部UI的变化
            ptrFrame.addPtrUIHandler(materialHeader);
            //4.判断是否可以下拉,数据刷新工作
            ptrFrame.setPtrHandler(new PtrHandler() {
                @Override
                public void onRefreshBegin(PtrFrameLayout frame) {
                    frame.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            img.setImageResource(R.mipmap.p2);
                            ptrFrame.refreshComplete();
                        }
                    }, 3000);
                }
    
                @Override
                public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
                    // 默认实现,根据实际情况做改动
                    return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
                }
            });
        }
    
        private void initHeaders() {
            /**
             * //第一种头部
             * StoreHouse风格的头部实现
             */
    
            storeHouseHeader=new StoreHouseHeader(this);
            storeHouseHeader.setBackgroundColor(Color.GRAY);
            storeHouseHeader.setTextColor(Color.RED);
            storeHouseHeader.setLineWidth(4);
            storeHouseHeader.initWithString("update");
    //        storeHouseHeader.initWithString("last  updatetime "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    
    
            //"last update @" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
    
            /**
             * //第二种头部
             * Material Design风格的头部实现
             */
            materialHeader = new MaterialHeader(this);
            materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});//类似SwipeRefreshLayout
    
    
            /**
             * //第三种头部
             * 经典 风格的头部实现
             */
            ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);
    
        }
    
        @Override
        protected void initData() {
    
        }
    
        @Override
        protected int getLayoutId() {
            return R.layout.activity_test;
        }
    }
    

      

  • 相关阅读:
    preexisting shared memory block (key 5432001, ID 2883585) is still in use
    软件测试活动中数据库使用场景
    细数一些环境原因发现的bug
    PAPI编译安装
    nvtop安装
    llvm clang源码编译安装
    MMCV源码编译
    TVM源码编译
    Googletest源码编译安装
    Pytorch源码编译安装
  • 原文地址:https://www.cnblogs.com/wangjiaghe/p/9846730.html
Copyright © 2020-2023  润新知