效果圖是這樣的,有入侵式的,非入侵式的,帶波浪效果的......就那幾個屬性,都給出來了,本身去試就行。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 }