欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

MaterialRefreshLayout+ListView 下拉刷新 上拉加载

程序员文章站 2022-03-30 09:51:17
效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行。 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种第三方的可以实现...... SwipeRefreshLayout是Google官方推出的一个控件, ......

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

MaterialRefreshLayout+ListView 下拉刷新 上拉加载MaterialRefreshLayout+ListView 下拉刷新 上拉加载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     }