There is the solution, Activity has to implement interface AbsListView.OnScrollListener
In Activity:
int currentFirstVisibleItem = 0;
int currentVisibleItemCount = 0;
int totalItemCount = 0;
int currentScrollState = 0;
boolean loadingMore = false;
Long startIndex = 0L;
Long offset = 10L;
View footerView;
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
this.totalItemCount = totalItemCount;
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
this.currentScrollState = scrollState;
this.isScrollCompleted();
}
private void isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE && this.totalItemCount == (currentFirstVisibleItem + currentVisibleItemCount)) {
/*** In this way I detect if there's been a scroll which has completed ***/
/*** do the work for load more date! ***/
if (!loadingMore) {
loadingMore = true;
new LoadMoreItemsTask(this).execute();
}
}
}
private class LoadMoreItemsTask extends AsyncTask<Void, Void, List<ListItem>> {
private Activity activity;
private View footer;
private LoadMoreItemsTask(Activity activity) {
this.activity = activity;
loadingMore = true;
footer = activity.getLayoutInflater().inflate(R.layout.base_list_item_loading_footer, null);
}
@Override
protected void onPreExecute() {
list.addFooterView(footer);
list.setAdapter(adapter);
super.onPreExecute();
}
@Override
protected List<ListItem> doInBackground(Void... voids) {
return getNextItems(startIndex, offset);
}
@Override
protected void onPostExecute(List<ListItem> listItems) {
if (footer != null) {
list.removeFooterView(footer);
}
list.setAdapter(adapter);
loadingMore = false;
if (listItems.size() > 0) {
startIndex = startIndex + listItems.size();
setItems(listItems);
}
super.onPostExecute(listItems);
}
}
Oncreate:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_list);
list = (ListView) findViewById(R.id.list);
list.setOnItemClickListener(this);
list.setOnScrollListener(this);
footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.base_list_item_loading_footer, null, false);
initAdapter();
new LoadMoreItemsTask(this).execute();
}
base_list_item_loading_footer.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item_footer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="15dp" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal" >
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</ProgressBar>
<TextView
style="@style/ItemHeadTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/loading_list_items" />
</LinearLayout>
</RelativeLayout>
I hope , it helps.