zoukankan      html  css  js  c++  java
  • MaterialRefreshLayout+ListView 下拉刷新 上拉加载

    效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行。

    下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种第三方的可以实现......

    SwipeRefreshLayout是Google官方推出的一个控件,不需要添加依赖什么的,直接使用即可,但是只支持下拉刷新,上拉加载没有实现,包括点击事件什么的也没有很好的集成,如果你的需求仅仅是列表展示,下拉刷新的话不妨一试,还是挺简单的。

    BGARefreshLayout支持四种下拉刷新和一种上拉加载效果,也非常不错,值得一试。

    还有BRVAH,一个更加强大的第三方库,使用BRVAH可以满足你大部分的需求,本文不做讲解,下篇文章再展开探讨。

    BRVAH官网链接:(非常推荐用这个)http://www.recyclerview.org/

    本文要讲的是MaterialRefreshLayout,因为仅仅演示刷新和加载效果,所以简单的用了ListView,也没有自己写适配器,简单的用了系统自带的ArrayAdapter。正常应该用RecycleView,毕竟可以自定义事件嘛。

    1.首先添加依赖。

    compile 'com.cjj.materialrefeshlayout:library:1.3.0'

    2.布局文件:

    如果复制过去的话可能会报错,没关系,重新加载一下项目就可以了。建议手写。

     1 <com.cjj.MaterialRefreshLayout  
     2     android:id="@+id/refresh"  
     3     xmlns:android="http://schemas.android.com/apk/res/android"  
     4     xmlns:app="http://schemas.android.com/apk/res-auto"  
     5     android:layout_width="match_parent"  
     6     android:layout_height="match_parent"  
     7     app:overlay="false"  
     8     app:wave_show="true"  
     9     >  
    10   
    11     <ListView  
    12         android:id="@+id/listview"  
    13         android:layout_width="match_parent"  
    14         android:layout_height="match_parent"/>  
    15 </com.cjj.MaterialRefreshLayout>

    还有几个属性可以自己试一试:

    app:wave_height_type="higher" 改变刷新布局的高度
    app:wave_color="#61bf5c"改变刷新布局的背景颜色

    3.初始化控件并给ListView设置适配器:

     1 private MaterialRefreshLayout mMaterialRefreshLayout;
     2 private ListView mListView;
     3 private ArrayList<String> list = new ArrayList<String>();
     4 private ArrayAdapter mArrayList;
     5 
     6 
     7 
     8 mMaterialRefreshLayout = (MaterialRefreshLayout)findViewById(R.id.refresh);
     9 mListView = (ListView) findViewById(R.id.listview);
    10 mArrayList = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
    11 mListView.setAdapter(mArrayList);
    1     /**
    2      * todo 在上拉刷新的时候,判断,是否处于上拉刷新,如果是的话,就禁止在一次刷新,保障在数据加载完成之前
    3      * todo 避免重复和多次加载
    4      */
    5     private Boolean isLoadMore = true;

    4.获取数据(这里用的是假数据):

    1     private void initDate() {
    2         for (int i = 0;i<6;i++) {
    3             list.add("Test3Test3Test3");
    4             list.add("Test4Test4Test4Test4");
    5             list.add("Test5Test5Test5Test5Test5");
    6         }
    7     }

    5.设置允许上拉加载更多,默认只允许下拉刷新不允许上拉加载。

            /**
             * todo 设置是否上拉加载更多,默认是false,要手动改为true,要不然不会出现上拉加载
             */
            mMaterialRefreshLayout.setLoadMore(isLoadMore);
    

    6.设置下拉、上拉的监听事件(重点):

    注意事项注释都有标注。

     1             mMaterialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
     2             @Override
     3             public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
     4                 mMaterialRefreshLayout.finishRefreshLoadMore();
     5                 //todo 一般加载数据都是在子线程中,这里我用到了handler
     6                 new Handler().postDelayed(new Runnable() {
     7                     @Override
     8                     public void run() {
     9                         for (int i = 0; i <= 3; i++) {
    10                             list.add(i,"下拉刷新 " + i);
    11                         }
    12                         mArrayList.notifyDataSetChanged();//todo 通知刷新
    13 
    14                         //下拉刷新停止
    15                         mMaterialRefreshLayout.finishRefresh();
    16                     }
    17                 },3000);
    18             }
    19 
    20 
    21 
    22 
    23 
    24             //todo 真正用的时候,就会去定义方法,获取数据,一般都是分页,在数据端获取的时候,把页数去增加一,然后在去服务端去获取数据
    25             @Override
    26             public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
    27                 super.onRefreshLoadMore(materialRefreshLayout);
    28                 mMaterialRefreshLayout.finishRefresh();
    29                 new Handler().postDelayed(new Runnable() {
    30                     @Override
    31                     public void run() {
    32                         isLoadMore = false;//todo 上拉的时候把下拉取消
    33                         for (int i = 0; i <= 3; i++) {
    34                             list.add("上拉加载" + i);
    35                         }
    36                         //todo 通知刷新
    37                         mArrayList.notifyDataSetChanged();
    38 
    39                         /**
    40                          * 完成加载数据后,调用此方法,要不然刷新的效果不会消失
    41                          */
    42                         mMaterialRefreshLayout.finishRefreshLoadMore();
    43                     }
    44                 }, 3000);
    45             }

    在代码中也可以动态设置各种属性:后两个一个是自动下拉刷新,一个是自动上拉加载

    1 materialRefreshLayout.setIsOverLay(true);
    2 materialRefreshLayout.setWaveShow(false);
    3 materialRefreshLayout.setWaveColor(0xffffffff);
    4 materialRefreshLayout.setLoadMore(true);
    5 materialRefreshLayout.autoRefresh();
    6 aterialRefreshLayout.autoRefreshLoadMore();

    总体代码给一个,仅供参考:

     1     private MaterialRefreshLayout mMaterialRefreshLayout;
     2     private ListView mListView;
     3     private ArrayList<String> list = new ArrayList<String>();
     4     private ArrayAdapter mArrayList;
     5 
     6     /**
     7      * todo 在上拉刷新的时候,判断,是否处于上拉刷新,如果是的话,就禁止在一次刷新,保障在数据加载完成之前
     8      * todo 避免重复和多次加载
     9      */
    10     private Boolean isLoadMore = true;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.activity_material_refresh_layout);
    16         initDate();
    17         initView();
    18     }
    19 
    20     //假数据
    21     private void initDate() {
    22         for (int i = 0;i<6;i++) {
    23             list.add("Test3Test3Test3");
    24             list.add("Test4Test4Test4Test4");
    25             list.add("Test5Test5Test5Test5Test5");
    26         }
    27     }
    28 
    29     private void initView() {
    30         mMaterialRefreshLayout = (MaterialRefreshLayout)findViewById(R.id.refresh);
    31         mListView = (ListView) findViewById(R.id.listview);
    32         mArrayList = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
    33         mListView.setAdapter(mArrayList);
    34 
    35         /**
    36          * todo 设置是否上拉加载更多,默认是false,要手动改为true,要不然不会出现上拉加载
    37          */
    38         mMaterialRefreshLayout.setLoadMore(isLoadMore);
    39         mMaterialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
    40             @Override
    41             public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
    42                 mMaterialRefreshLayout.finishRefreshLoadMore();
    43                 //todo 一般加载数据都是在子线程中,这里我用到了handler
    44                 new Handler().postDelayed(new Runnable() {
    45                     @Override
    46                     public void run() {
    47                         for (int i = 0; i <= 3; i++) {
    48                             list.add(i,"下拉刷新 " + i);
    49                         }
    50                         mArrayList.notifyDataSetChanged();//todo 通知刷新
    51 
    52                         //下拉刷新停止
    53                         mMaterialRefreshLayout.finishRefresh();
    54                     }
    55                 },3000);
    56             }
    57 
    58             //todo 真正用的时候,就会去定义方法,获取数据,一般都是分页,在数据端获取的时候,把页数去增加一,然后在去服务端去获取数据
    59             @Override
    60             public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
    61                 super.onRefreshLoadMore(materialRefreshLayout);
    62                 mMaterialRefreshLayout.finishRefresh();
    63                 new Handler().postDelayed(new Runnable() {
    64                     @Override
    65                     public void run() {
    66                         isLoadMore = false;//todo 上拉的时候把下拉取消
    67                         for (int i = 0; i <= 3; i++) {
    68                             list.add("上拉加载" + i);
    69                         }
    70                         //todo 通知刷新
    71                         mArrayList.notifyDataSetChanged();
    72 
    73                         /**
    74                          * 完成加载数据后,调用此方法,要不然刷新的效果不会消失
    75                          */
    76                         mMaterialRefreshLayout.finishRefreshLoadMore();
    77                     }
    78                 }, 3000);
    79             }
    80         });
    81     }
    82 
    83 
    84     public void goBack(View view) {
    85         finish();
    86     }
  • 相关阅读:
    kubeadm init 时从本地私有仓库下载镜像
    Kubernetes 1.6新特性
    kukubeadm 1.6.1 + docker1.2.6 安装问题
    nginx 配置
    使用nginx替换Ingress
    Docker存储方式选型建议
    iptables相关
    kubenetes master使用curl 操作API
    kubernetes 一些基本的概念
    Codeforces Round #161 (Div. 2) D. Cycle in Graph(无向图中找指定长度的简单环)
  • 原文地址:https://www.cnblogs.com/blog4wei/p/8983789.html
Copyright © 2011-2022 走看看