效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,本身去试就行。android
下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下居然有几十种第三方的能够实现......app
SwipeRefreshLayout是Google官方推出的一个控件,不须要添加依赖什么的,直接使用便可,可是只支持下拉刷新,上拉加载没有实现,包括点击事件什么的也没有很好的集成,若是你的需求仅仅是列表展现,下拉刷新的话不妨一试,仍是挺简单的。ide
BGARefreshLayout支持四种下拉刷新和一种上拉加载效果,也很是不错,值得一试。布局
还有BRVAH,一个更增强大的第三方库,使用BRVAH能够知足你大部分的需求,本文不作讲解,下篇文章再展开探讨。post
BRVAH官网连接:(很是推荐用这个)http://www.recyclerview.org/this
本文要讲的是MaterialRefreshLayout,由于仅仅演示刷新和加载效果,因此简单的用了ListView,也没有本身写适配器,简单的用了系统自带的ArrayAdapter。正常应该用RecycleView,毕竟能够自定义事件嘛。spa
1.首先添加依赖。线程
compile 'com.cjj.materialrefeshlayout:library:1.3.0'code
2.布局文件:xml
若是复制过去的话可能会报错,不要紧,从新加载一下项目就能够了。建议手写。
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 }