Адаптер бесконечного списка 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);

                      ...
Другие вопросы по тегам