PaginateライブラリによるRecyclerViewページングロード機能(一):基本実装
21806 ワード
Paginateライブラリのアドレス:PaginateライブラリのアドレスはまずGradleに導入されます.
Implement Paginate.Callbacks Paginateライブラリのクラスを使用するには、onLoadMore()、isLoading()、hasLoaddAllItems()の3つのメソッドを持つPaginate.Callbacksインタフェースを実装する必要があります.ソースコードは次のとおりです.
データをロードする必要があるときにonLoadMore()メソッドを呼び出し、isLoading()はロード中かどうかを判断し、ロード中であればtrueを返し、そうでなければfalse、hasLoadedAllItems()はロードする必要があるデータがあるかどうかを判断し、すべてのデータをロードした場合trueを返し、そうでなければfalseを返す.
自分のコードを見てみましょう.
onFinishedCreateメソッドでは、setupPagination()とLoadData()の2つのメソッドが呼び出されます.setupPagination()メソッドの内容を次に示します.
まずpaginateオブジェクトの状態を判断し、paginateの状態が空でない場合はpaginateオブジェクトをRecyclerViewと分割し、次にRecyclerViewのadapterオブジェクトの宣言、R.layout.item_bind_recordは各viewのコンテナを表し、convert()メソッドはRecyclerAdapterクラスのonBindViewHolder()メソッドによって提供され、このメソッドはクラスで以下のように記述されている.
helperオブジェクトを使用して与えられたitemをviewに適合させ、recyclerViewでLayoutManagerとAdapterを設定し、recyclerViewでpaginateオブジェクトを作成します.
次に、LoadData()メソッドの内容を示します.
LoadData()メソッドでは、ネットワークインタフェースにアクセスしてデータを要求し、bindRecordVoオブジェクトにデータを保存し、totalとsizeの2つの変数でページングされた合計ページ数totalPagesを計算し、forループを使用して遍歴し、arrayListイメージにデータを追加します.adapterオブジェクトからrecyclerViewにarrayListを追加し、要求が完了した後にLoadingの値をfalseとして割り当て、ロードメソッドの呼び出しを制御します.
次に、CallBacksインタフェースの3つの方法の具体的な実装を示します.
onLoadMore()メソッドでは、まずloadingの値を判断し、loadingがtrueでない場合はloadingの値をtrueとして付与してデータのロードを行い、pageは現在の要求データのページ数を表し、LoadDataメソッドを呼び出してデータのロードを行う.isLoading()メソッドで現在のloadingの値を返します.loadingがfalseの場合、現在データがロードされていないことを示し、loadingがtrueの場合、現在データがロードされていることを示します.hasLoadedAllItems()メソッドでpageとtotalPagesの値を比較します.pageの値は、現在要求されているページ数を表すデータがロードされるたびに1回増加します.totalPagesの値は、データが要求されている間に計算され、合計ページ数を表します.現在要求されているページ数が合計ページ数に等しい場合は、最後のページにロードされ、すべてのデータがロードされたことを示します.このメソッドがtrueの値を返すと、現在のpaginateオブジェクトのタスクはすべて完了し、その後、このpaginateオブジェクトは何もしません.
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オブジェクトは何もしません.