Android listview 使用 Retrofit 无限滚动
Android listview infinite scrolling using Retrofit
我目前的项目需要你的帮助。要求是使列表视图分页并在向下滚动时加载其他数据,就像 Facebook 和 Twitter 应用程序所做的那样。
这是我目前尝试过的方法:
MainActivity
listView.setOnScrollListener(new InfiniteScrollListener() {
public boolean onLoadMore(int page, int totalItemsCount) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to your AdapterView
customLoadMoreDataFromApi(page);
// or customLoadMoreDataFromApi(totalItemsCount);
return true; // ONLY if more data is actually being loaded; false otherwise.
}
});
private void getData() {
if(ConnectionDetector.hasNetworkConnection(getActivity())) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(HOME_DOMAIN)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
WebServices service = restAdapter.create(WebServices.class);
service.getRecords(
"1", // Row
"10", // Count
new Callback<World>() {
@Override
public void success(Som som, Response response) {
dataList = Parser.getResponseBody(response);
adapter = new SomAdapter(getActivity(), dataList);
listView.setAdapter(adapter);
}
@Override
public void failure(RetrofitError retrofitError) {
Log.e(TAG, "" + retrofitError.toString());
}
});
} else {
Toast.makeText(getActivity(),
getActivity().getResources().getString(R.string.connection_error),
Toast.LENGTH_SHORT).show();
}
}
// Append more data into the adapter
public void customLoadMoreDataFromApi(int offset) {
// This method probably sends out a network request and appends new data items to your adapter.
// Use the offset value and add it as a parameter to your API request to retrieve paginated data.
// Deserialize API response and then construct new objects to append to the adapter
getData();
moreProgress.setVisibility(View.VISIBLE);
Log.e(TAG, "MORE PROGRESS");
}
InfiniteScrollListener:
public abstract class InfiniteScrollListener implements AbsListView.OnScrollListener {
private int bufferItemCount = 10;
private int currentPage = 0;
private int itemCount = 0;
private boolean isLoading = true;
public InfiniteScrollListener(int bufferItemCount) {
this.bufferItemCount = bufferItemCount;
}
public abstract void loadMore(int page, int totalItemsCount);
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// Do Nothing
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if (totalItemCount < itemCount) {
this.itemCount = totalItemCount;
if (totalItemCount == 0) {
this.isLoading = true; }
}
if (isLoading && (totalItemCount > itemCount)) {
isLoading = false;
itemCount = totalItemCount;
currentPage++;
}
if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) {
loadMore(currentPage + 1, totalItemCount);
isLoading = true;
}
}
}
向下滚动时显示进度条。这可行,但我还需要将下一个获取的数据附加到列表视图。我该怎么做?我需要你的建议,因为这是我第一次在 Android 中进行分页。谢谢!
你做对了一切。但是不需要创建新的 SomAdapter,你只需要将新获取的数据添加到它
@Override
public void success(Som som, Response response) {
dataList = Parser.getResponseBody(response);
if (adapter == null) {
adapter = new SomAdapter(getActivity(),dataList);
listView.setAdapter(adapter);
} else {
adapter.addAll(dataList);
}
}
如果您制作自定义适配器而不是扩展 ArrayAdapter,请确保您的 addAll 方法具有 notifyDataSetChanged
.
更改 getData() 以获取参数偏移量和分页请求逻辑。
我目前的项目需要你的帮助。要求是使列表视图分页并在向下滚动时加载其他数据,就像 Facebook 和 Twitter 应用程序所做的那样。
这是我目前尝试过的方法:
MainActivity
listView.setOnScrollListener(new InfiniteScrollListener() {
public boolean onLoadMore(int page, int totalItemsCount) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to your AdapterView
customLoadMoreDataFromApi(page);
// or customLoadMoreDataFromApi(totalItemsCount);
return true; // ONLY if more data is actually being loaded; false otherwise.
}
});
private void getData() {
if(ConnectionDetector.hasNetworkConnection(getActivity())) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(HOME_DOMAIN)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
WebServices service = restAdapter.create(WebServices.class);
service.getRecords(
"1", // Row
"10", // Count
new Callback<World>() {
@Override
public void success(Som som, Response response) {
dataList = Parser.getResponseBody(response);
adapter = new SomAdapter(getActivity(), dataList);
listView.setAdapter(adapter);
}
@Override
public void failure(RetrofitError retrofitError) {
Log.e(TAG, "" + retrofitError.toString());
}
});
} else {
Toast.makeText(getActivity(),
getActivity().getResources().getString(R.string.connection_error),
Toast.LENGTH_SHORT).show();
}
}
// Append more data into the adapter
public void customLoadMoreDataFromApi(int offset) {
// This method probably sends out a network request and appends new data items to your adapter.
// Use the offset value and add it as a parameter to your API request to retrieve paginated data.
// Deserialize API response and then construct new objects to append to the adapter
getData();
moreProgress.setVisibility(View.VISIBLE);
Log.e(TAG, "MORE PROGRESS");
}
InfiniteScrollListener:
public abstract class InfiniteScrollListener implements AbsListView.OnScrollListener {
private int bufferItemCount = 10;
private int currentPage = 0;
private int itemCount = 0;
private boolean isLoading = true;
public InfiniteScrollListener(int bufferItemCount) {
this.bufferItemCount = bufferItemCount;
}
public abstract void loadMore(int page, int totalItemsCount);
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// Do Nothing
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if (totalItemCount < itemCount) {
this.itemCount = totalItemCount;
if (totalItemCount == 0) {
this.isLoading = true; }
}
if (isLoading && (totalItemCount > itemCount)) {
isLoading = false;
itemCount = totalItemCount;
currentPage++;
}
if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) {
loadMore(currentPage + 1, totalItemCount);
isLoading = true;
}
}
}
向下滚动时显示进度条。这可行,但我还需要将下一个获取的数据附加到列表视图。我该怎么做?我需要你的建议,因为这是我第一次在 Android 中进行分页。谢谢!
你做对了一切。但是不需要创建新的 SomAdapter,你只需要将新获取的数据添加到它
@Override
public void success(Som som, Response response) {
dataList = Parser.getResponseBody(response);
if (adapter == null) {
adapter = new SomAdapter(getActivity(),dataList);
listView.setAdapter(adapter);
} else {
adapter.addAll(dataList);
}
}
如果您制作自定义适配器而不是扩展 ArrayAdapter,请确保您的 addAll 方法具有 notifyDataSetChanged
.
更改 getData() 以获取参数偏移量和分页请求逻辑。