1. 程式人生 > >安卓專案實戰之:最實用的載入中、無網路、無資料、出錯四種情況切換庫的使用總結

安卓專案實戰之:最實用的載入中、無網路、無資料、出錯四種情況切換庫的使用總結

效果圖

在這裡插入圖片描述
錄出來的效果不是很好,真機上展示效果還算完美。
如圖所示該效果的實現依賴三個庫:
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