1

LazyList EndlessListを作成しようとしていますが、セクション化されたアダプターを使用しています...セクションはインターネットからダウンロードされるアイテムのページになります。

私は、MergeAdapterまたは非推奨のSectionedAdapter(Mark Murphyによる)の両方を使用して、その基本的な要点を実装しようとしました。しかし、私はそれらの両方で問題に直面しています。

1)SectionedAdapterを使用すると、最初のページが正常に読み込まれますが、2番目のページでこの例外が発生します。

Uncaught handler: thread main exiting due to uncaught exception
java.lang.ArrayIndexOutOfBoundsException
at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3572)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:2487)
at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:2353)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4363)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)

何時間もの調査の結果、私はそれが間違ったgetViewTypeCount()価値と関係があることに気づきました。しかし、それを正しく実装する方法がわかりません。

2)次に、MergeAdapterを使用してみましたが、セクションがランダムな間隔で表示されるため、さらに悪化しました。

実装を示すためだけに、小さなサンプルプログラムを作成しました。

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class LazySectionListActivity extends ListActivity implements
        OnScrollListener {

    private int mPrevItemCount;
    private int nextPrimes = 0;
    private final int MAX = 100;
    private final SectionAdapter adapter = new SectionAdapter();

    // private final MergeAdapter adapter = new MergeAdapter();

    private class SectionAdapter extends SectionedAdapter {

        @Override
        protected View getHeaderView(String caption, int index,
                                     View convertView, ViewGroup parent) {
            TextView tv = new TextView(LazySectionListActivity.this);
            tv.setText(caption);
            return tv;
        }

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setProgressBarIndeterminate(true);
        setContentView(R.layout.main);
        getListView().setOnScrollListener(this);
        setListAdapter(adapter);
        new NextThousandPrimes(nextPrimes).execute();
        nextPrimes += MAX;
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {

        if(firstVisibleItem + visibleItemCount >= totalItemCount
           && mPrevItemCount != totalItemCount) {
            new NextThousandPrimes(nextPrimes).execute();
            nextPrimes += MAX;
            mPrevItemCount = totalItemCount;
        }

    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    private class NextThousandPrimes extends AsyncTask<Void, Void, Void> {
        private final int start;
        private final List<String> primes = new ArrayList<String>();

        public NextThousandPrimes(int nextPrimes) {
            this.start = nextPrimes;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            setProgressBarIndeterminateVisibility(true);
        }

        @Override
        protected Void doInBackground(Void... params) {
            for(int s = start; s < start + MAX; s++)
                if(BigInteger.valueOf(s).isProbablePrime(1)) {
                    primes.add(String.valueOf(s));
                }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            setProgressBarIndeterminateVisibility(false);
            //TextView view = new TextView(LazySectionListActivity.this);//for merge adapter, use the commented code
            //view.setText(String.format("%d-%d", start, start + MAX));
            // adapter.addView(view);
            // adapter.addAdapter(new
            // ArrayAdapter<String>(LazySectionListActivity.this,
            // android.R.layout.simple_list_item_1,
            // primes));
            adapter.addSection(String.format("%d-%d", start, start + MAX),
                               new ArrayAdapter<String>(LazySectionListActivity.this,
                                                        android.R.layout.simple_list_item_1,
                                                        primes));
            adapter.notifyDataSetChanged();

        }
    }
}

だから私は何が欠けていますか?どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

5

ドキュメントに記載されているようにMergeAdapter

setListAdapter()を呼び出してMergeAdapterをListViewに関連付ける前に、コンテンツをMergeAdapterに注ぐ必要があります。AndroidはgetViewTypeCount()を1回だけ呼び出すため、この制限が必要です。ビューまたはアダプターを追加すると、ビュータイプが追加されます。

したがって、MergeAdapter可能なビュータイプがいくつあるかわからないため、無限の設定では機能しません。

のコピーをハッキングしてみてください。ここで、必要以上に大きくなることが確実な値になるようにMergeAdapter配線し、それが機能するかどうかを確認します。ことわざにあるように、あなたのマイレージは変わるかもしれません... :-)getViewTypeCount()

于 2012-03-15T12:54:02.813 に答える