安卓專案實戰之:最實用的載入中、無網路、無資料、出錯四種情況切換庫的使用總結
效果圖
錄出來的效果不是很好,真機上展示效果還算完美。
如圖所示該效果的實現依賴三個庫:
1,頂部Tab導航:比TabLayout功能更強大的FlycoTabLayout,具體使用檢視本人之前部落格:安卓專案實戰之:FlycoTabLayout和FlycoRoundView的介紹及使用
2,精美的Toast:檢視之前部落格:安卓專案實戰之:基於Toasty庫封裝的精美的Toast工具類
3,Fragment使用了懶載入:具有懶載入功能的 Fragment基類封裝
4,四種狀態頁面切換庫:LoadDataLayout
本篇我們通過一個例項來具體講解LoadDataLayout開源庫的簡單使用,相關的其他功能在其他文章中都有詳細介紹。
相關庫引用:
compile 'com.flyco.tablayout:FlycoTabLayout_Lib:[email protected]'
compile 'com.github.GrenderG:Toasty:1.1.5'
compile 'com.ganxin.library:loaddatalayout:1.0.1'
具體使用
1,Fragment的佈局:
<?xml version="1.0" encoding="utf-8"?>
<com.ganxin.library.LoadDataLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/loadDataLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android: id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="marquee"
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:textColor="#ff0000"
android:textSize="30sp" />
</LinearLayout>
</com.ganxin.library.LoadDataLayout>
注意:根佈局使用LoadDataLayout,該佈局和ScrollView的用法一樣只允許新增一個子View,我們可以將所有的內容通過一個根佈局包裹然後作為它的子View,此處順便再給大家推薦一個新佈局容器:約束佈局ConstraintLayout,網上關於它的介紹也比較多,讀者自行去了解,本例中佈局比較簡單,暫時沒有用到。
2,對應Fragment程式碼如下:
public class MyFragment extends BaseLazyLoadFragment {
private String str;
private LoadDataLayout loadDataLayout;
private TextView tv;
public MyFragment() {
}
public MyFragment(String str) {
this.str = str;
}
@Override
public int setLayoutResourceID() {
return R.layout.fragment;
}
@Override
public void initView() {
tv = view.findViewById(R.id.tv);
loadDataLayout = view.findViewById(R.id.loadDataLayout);
loadDataLayout.setStatus(LoadDataLayout.LOADING);
// 重新載入點選監聽
loadDataLayout.setOnReloadListener(new LoadDataLayout.OnReloadListener() {
@Override
public void onReload(View v, int status) {
ToastUtils.toastInfo("重新載入了!",true);
loadDataLayout.setStatus(LoadDataLayout.LOADING);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// tv.setText(str); // 該句模擬有資料的情況,直接給TextView賦值
loadDataLayout
.setReloadBtnVisible(false) // 預設資料為空的時候也會顯示重新載入按鈕,此處設定不顯示,具體視需求而定
// .setEmptyImage(R.mipmap.ic_launcher) // 可以替換成自己的圖片
.setEmptyText("Sorry!該分類下資料暫時為空QwQ")
.setStatus(LoadDataLayout.EMPTY);
}
},2000);
}
});
}
@Override
public void onLazyLoad() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
loadDataLayout
// 設定重新載入觸發的區域,預設為LoadDataLayout.BUTTON,即按鈕所在區域
.setReloadClickArea(LoadDataLayout.FULL) // 點選螢幕任意區域重新載入
.setStatus(LoadDataLayout.ERROR);
}
},3000);
}
}
具體的懶載入Fragment基類封裝檢視之前部落格,Copy過來即可。
3,最後在貼上Activity程式碼:
public class MainActivity extends AppCompatActivity {
private ImageView add;
private SlidingTabLayout tablayout;
private ViewPager viewPager;
private ArrayList<BaseLazyLoadFragment> mFagments = new ArrayList<>();
private String[] mTitles = {"頭條", "社會", "國內", "國際", "遊戲", "體育"};
private MyPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
add = findViewById(R.id.add);
tablayout = findViewById(R.id.tab_layout);
viewPager = findViewById(R.id.viewpager);
mFagments.add(new MyFragment("頭條"));
mFagments.add(new MyFragment("社會"));
mFagments.add(new MyFragment("國內"));
mFagments.add(new MyFragment("國際"));
mFagments.add(new MyFragment("遊戲"));
mFagments.add(new MyFragment("體育"));
adapter = new MyPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
tablayout.setViewPager(viewPager, mTitles);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(MainActivity.this, "點選了新增按鈕333!", Toast.LENGTH_SHORT).show();
ToastUtils.toastInfo("點選了按鈕222!",true);
// 跳轉到頻道分類管理頁面
// startActivity(new Intent(MainActivity.this,TypeManageActivity.class));
}
});
}
private class MyPagerAdapter extends FragmentPagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return mFagments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
@Override
public Fragment getItem(int position) {
return mFagments.get(position);
}
}
}
至此上面的效果就完美實現了,關於該庫的使用所有的程式碼都在MyFragment裡面了,這裡再強調一下:
1,該庫支援在Application裡面進行全域性配置(上面例子沒有提到,可檢視GitHub官網),同時也支援在使用時的區域性配置(上面例子展示到了並演示了部分設定)
2,所有的樣式,圖片,文字,包括文字大小顏色等等都是可以配置的,配置方式具體檢視GitHub。
關於其他使用點此檢視GitHub介紹:LoadDataLayout