PaginateライブラリによるRecyclerViewページングロード機能(一):基本実装

21806 ワード

Paginateライブラリのアドレス:PaginateライブラリのアドレスはまずGradleに導入されます.
compile 'com.github.markomilos:paginate:0.5.1'

Implement Paginate.Callbacks Paginateライブラリのクラスを使用するには、onLoadMore()、isLoading()、hasLoaddAllItems()の3つのメソッドを持つPaginate.Callbacksインタフェースを実装する必要があります.ソースコードは次のとおりです.
public interface Callbacks {
        /** Called when next page of data needs to be loaded. */
        void onLoadMore();

        /**
         * Called to check if loading of the next page is currently in progress. While loading is in progress
         * {@link com.paginate.Paginate.Callbacks#onLoadMore} won't be called.
         *
         * @return true if loading is currently in progress, false otherwise.
         */
        boolean isLoading();

        /**
         * Called to check if there is more data (more pages) to load. If there is no more pages to load, {@link
         * com.paginate.Paginate.Callbacks#onLoadMore} won't be called and loading row, if used, won't be added.
         *
         * @return true if all pages has been loaded, false otherwise.
         */
        boolean hasLoadedAllItems();
    }

データをロードする必要があるときにonLoadMore()メソッドを呼び出し、isLoading()はロード中かどうかを判断し、ロード中であればtrueを返し、そうでなければfalse、hasLoadedAllItems()はロードする必要があるデータがあるかどうかを判断し、すべてのデータをロードした場合trueを返し、そうでなければfalseを返す.
自分のコードを見てみましょう.
@Override
    protected void onFinishedCreate() {
        super.onFinishedCreate();
        recyclerView = findViewById(R.id.recy);
        setupPagination();
        LoadData();
    }

onFinishedCreateメソッドでは、setupPagination()とLoadData()の2つのメソッドが呼び出されます.setupPagination()メソッドの内容を次に示します.
private void setupPagination() {
        if (paginate != null) {
            paginate.unbind();
        }
        adapter = new RecyclerAdapter<BindRecordVo.ContentBean>(R.layout.item_bind_record) {
            @Override
            protected void convert(AdapterHelper helper, BindRecordVo.ContentBean item, int position) {
                helper.setText(R.id.device_name, item.alias);
                helper.setText(R.id.groupFullName, item.groupFullName);
            }
        };
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        recyclerView.setAdapter(adapter);
        paginate = Paginate.with(recyclerView, this)
                .setLoadingTriggerThreshold(1)
                .addLoadingListItem(addLoadingRow)//        
                .build();
    }

まずpaginateオブジェクトの状態を判断し、paginateの状態が空でない場合はpaginateオブジェクトをRecyclerViewと分割し、次にRecyclerViewのadapterオブジェクトの宣言、R.layout.item_bind_recordは各viewのコンテナを表し、convert()メソッドはRecyclerAdapterクラスのonBindViewHolder()メソッドによって提供され、このメソッドはクラスで以下のように記述されている.
/**
     * Implement this method and use the helper to adapt the view to the given item.
     *
     * @param helper   A fully initialized helper.
     * @param item     The item that needs to be displayed.
     * @param position
     */
    protected abstract void convert(AdapterHelper helper, T item, int position);

helperオブジェクトを使用して与えられたitemをviewに適合させ、recyclerViewでLayoutManagerとAdapterを設定し、recyclerViewでpaginateオブジェクトを作成します.
次に、LoadData()メソッドの内容を示します.
private void LoadData() {
        JkAPiClientUti.getApi().getOrgBindRecords(page, 3, 2)
                .compose(ComposeHelper.response(new IProgressImpl(context), new OnToastDataFail()))
                .compose(RxLife.with(this).bindToLifecycle())
                .subscribe(new Action1<BindRecordVo>() {
                    @Override
                    public void call(BindRecordVo bindRecordVo) {
                        int total = bindRecordVo.total;
                        int size = bindRecordVo.pageable.size;
                        totalPages = (total / size);

                        page = bindRecordVo.pageable.page;
                        Finelog.d(bindRecordVo);
                        Finelog.d(totalPages);
                        ArrayList<BindRecordVo.ContentBean> arrayList = new ArrayList<>();
                        for (int i = 0; i < bindRecordVo.content.size(); i++) {
                            String alias = bindRecordVo.content.get(i).alias;
                            String groupFullName = bindRecordVo.content.get(i).groupFullName;
                            arrayList.add(new BindRecordVo.ContentBean(alias, groupFullName));
                        }
                        Finelog.d("page=" + page);

                        adapter.addData(arrayList);
                        adapter.notifyDataSetChanged();

                        Finelog.d(adapter.getData());
                        loading = false;
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        loading = false;
                    }
                });
    }

LoadData()メソッドでは、ネットワークインタフェースにアクセスしてデータを要求し、bindRecordVoオブジェクトにデータを保存し、totalとsizeの2つの変数でページングされた合計ページ数totalPagesを計算し、forループを使用して遍歴し、arrayListイメージにデータを追加します.adapterオブジェクトからrecyclerViewにarrayListを追加し、要求が完了した後にLoadingの値をfalseとして割り当て、ロードメソッドの呼び出しを制御します.
次に、CallBacksインタフェースの3つの方法の具体的な実装を示します.
@Override
    public void onLoadMore() {
        if (!loading) {
            page++;
            loading = true;
            LoadData();
        }
    }

    @Override
    public boolean isLoading() {
        return loading;
    }

    @Override
    public boolean hasLoadedAllItems() {
        return page == totalPages;
    }

onLoadMore()メソッドでは、まずloadingの値を判断し、loadingがtrueでない場合はloadingの値をtrueとして付与してデータのロードを行い、pageは現在の要求データのページ数を表し、LoadDataメソッドを呼び出してデータのロードを行う.isLoading()メソッドで現在のloadingの値を返します.loadingがfalseの場合、現在データがロードされていないことを示し、loadingがtrueの場合、現在データがロードされていることを示します.hasLoadedAllItems()メソッドでpageとtotalPagesの値を比較します.pageの値は、現在要求されているページ数を表すデータがロードされるたびに1回増加します.totalPagesの値は、データが要求されている間に計算され、合計ページ数を表します.現在要求されているページ数が合計ページ数に等しい場合は、最後のページにロードされ、すべてのデータがロードされたことを示します.このメソッドがtrueの値を返すと、現在のpaginateオブジェクトのタスクはすべて完了し、その後、このpaginateオブジェクトは何もしません.