Адаптер бесконечного списка CWAC работает с ActionBarActivity и как запустить загрузку внизу списка?
Я пытаюсь реализовать бесконечный список в приложении, в котором вы получаете первые 25 результатов из веб-сервиса, а когда он попадает в конец списка, он загружает следующие 25 и так далее, пока не достигнет общих результатов. Но я растерялся из-за того, что адаптер бесконечного списка узнает, когда я достиг дна списка? Я посмотрел на пример DemoAdapter и EndlessAdapterDemo из cwac, но не могу понять это... или это связано с моей деятельностью, не ListActivity (думаю, нет)? Первые 25 результатов загружаются в список, но после этого мне нужно изменить параметры вызова для вызова следующих 25. Я не использую asyntask (используя что-то еще) для получения результатов или неправильно интерпретировал руководство по использованию asnytask в cacheInBackground? но когда и как появляется бесконечная адаптация в игре? Вот моя реализация адаптера:
public class SearchResultEndlessAdapter extends EndlessAdapter {
private static final String TAG = SearchResultEndlessAdapter.class.getSimpleName();
private RotateAnimation rotate = null;
private LayoutInflater inflater;
private View pendingView = null;
private List<KeywordSearchResults> newKsearchResultList;
private int limit = 0;
public SearchResultEndlessAdapter(SearchResultListAdapter adapter, Context ctx) {
super(adapter);
this.inflater = LayoutInflater.from(ctx);
rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(600);
rotate.setRepeatMode(Animation.RESTART);
rotate.setRepeatCount(Animation.INFINITE);
}
/**
* Set the new list that is loaded from the webservice
*
* @param newKsearchResultList
* List<KeywordSearchResults>
*/
public void setNewData(List<KeywordSearchResults> newKsearchResultList) {
this.newKsearchResultList = new ArrayList<KeywordSearchResults>(newKsearchResultList);
}
/**
* The value of total results
*
* @param limit
* int
*/
public void setLimit(int limit) {
this.limit = limit;
}
@Override
protected void appendCachedData() {
LogService.log(TAG, "appendCachedData");
if (getWrappedAdapter().getCount() < limit) {
SearchResultListAdapter srListAdapter = (SearchResultListAdapter) getWrappedAdapter();
for (KeywordSearchResults kws : newKsearchResultList) {
srListAdapter.add(kws);
}
}
}
@Override
protected boolean cacheInBackground() throws Exception {
LogService.log(TAG, "cacheInBackground");
return (getWrappedAdapter().getCount() < limit);
}
@Override
protected View getPendingView(ViewGroup parent) {
LogService.log(TAG, "getPendingView");
View row = inflater.inflate(R.layout.row, null);
pendingView = row.findViewById(android.R.id.text1);
pendingView.setVisibility(View.GONE);
pendingView = row.findViewById(R.id.throbber);
pendingView.setVisibility(View.VISIBLE);
pendingView.startAnimation(rotate);
startProgressAnimation();
return (row);
}
public void startProgressAnimation() {
if (pendingView != null) {
pendingView.startAnimation(rotate);
}
}
}
И части из myActivity, которые расширяют ActionBarActivity:
//in oncreate
searchResultEndlessAdapter = new SearchResultEndlessAdapter(searchResultadapter,this);
searchResultEndlessAdapter.setRunInBackground(false);
mListView.setAdapter(searchResultEndlessAdapter);
mListView.setOnItemClickListener(this);
mListView.setOnScrollListener(this);
//callbacks of scroll
@Override
public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) {
//something needs to be done here with endlessAdapter ?
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
}
2 ответа
Ну не мог заставить его работать с адаптером cwacs.. сделал это нормально.
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int loadedItems = firstVisibleItem + visibleItemCount;
if ((loadedItems == totalItemCount) && !isloading && totalItemCount > 1) {
if (!isloading) {
isloading = true;
if (!((start - 1) == total)) {
// call ws
search();
}
}
}
}
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
}
Вы также можете использовать EndlessAdapter с ActionBarActivity. Все, что вам нужно сделать, это изменить свой адаптер в Activity, который расширяет ActionBarActivity на SearchResultEndlessAdapter, который вы сделали. Убедитесь, что вы делаете конструкторы правильно.
Например, это в моей деятельности, которая расширяет ActionBarActivity:
...
if (adapter == null) {
ArrayList<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();
items.addAll(questionsList);
adapter = new CustomAdapter(this, items);
}
else {
adapter.startProgressAnimation();
}
listView.setAdapter(adapter);
...