0

Web サービスから最初の 25 の結果を取得し、リストの一番下に移動すると、合計結果に達するまで次の 25 などをロードするアプリケーションにエンドレス リストを実装しようとしています。しかし、私がリストの一番下に達したとき、エンドレス リスト アダプターはどのように認識しているのでしょうか。私は cwac から DemoAdapter と EndlessAdapterDemo の例を見ましたが、それを理解することはできません..またはそれは私のアクティビティが ListActivity ではないことに関係していますか? 最初の 25 個の結果がリストにロードされますが、その後、次の 25 個を呼び出すように呼び出しパラメータを変更する必要があります しかし、いつ、どのようにしてエンドレスアダプターが登場するのでしょうか? アダプターの私の実装は次のとおりです。

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);
        }
    }
}

そして、ActionBarActivity を拡張する myActivity の一部:

//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) {

}
4

2 に答える 2

0

ActionBarActivity で EndlessAdapter を使用することもできます。あなたがする必要があるのは、あなたが作成した SearchResultEndlessAdapter に ActionBarActivity を拡張する Activity のアダプターを変更することだけです。コンストラクタを適切に実行していることを確認してください。

たとえば、これは 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);

                      ...
于 2014-04-05T03:20:33.797 に答える
0

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) {

    }
于 2014-03-13T15:39:19.600 に答える