0

私はデータベースを持っています。たとえば、Departments と Employees の 2 つのテーブルが含まれています。両方のテーブルにたくさんの項目があります。データは に入力されExpandableListViewます。今、私は拡張するカスタムアダプターを使用していますCursorTreeAdapter. 状況は十分ですが、思ったよりも遅くなることがあります。性能はアダプタの種類に依存しますか? もしそうなら、どのアダプタが優れていますか?

コード。

private class MyAdapter extends CursorTreeAdapter implements OnClickListener {

    public MyAdapter(Cursor cursor, Context context) {
        super(cursor, context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }

    @Override
    protected Cursor getChildrenCursor(Cursor groupCursor) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {
        // TODO Auto-generated method stub

    }

    @Override
    protected View newChildView(Context context, Cursor cursor, boolean isLastChild, ViewGroup parent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {
        // TODO Auto-generated method stub

    }

}
4

3 に答える 3

3

これはあなたの減速の一部につながるかもしれないと思います:

       Cursor indicatorsCursor = getActivity().getContentResolver().query(
                JsonDataProvider.Uris.IND_BY_BULLET_AND_COMPLEXITY, null, null,
                selectionArgs, null);

メソッドでカーソルを引っ張ったり、クエリを実行したりしないgetViewでください...リストに表示されているすべてのビューに対して実行し、スクロールするときにビューごとに実行しているため、おそらく速度低下の原因です。

やらなければならないなら、賢くやれ。スクロールが止まるまでカーソルを引っ張らないでください。スクロールリスナーとフラグを入れます。ifスクロール中に、フラグを true に設定し、フラグが設定されている間はそれらをスキップするステートメントでアダプターのデータ集約型ビットを囲みます。スクロールが終了したら、フラグをクリアしnotifyDataSetChanged、表示されているリスト項目の再描画を強制するために使用します (スクロールしていないため、db クエリが実行されます)。

リストビューにリスナーを設定します。

listView.setOnScrollListener(new OnScrollListener() {   
    public void onScroll(AbsListView view, int firstVisible,   
    int visibleCount, int total) {   
        public void onScrollStateChanged(AbsListView view, int scrollState) {   
            if (scrollState != 0)   
                listView.getAdapter().isScrolling = true;   
            else {   
                listView.getAdapter().isScrolling = false;  
                listView.getAdapter().notifyDataSetChanged();  
            }  
        }  
    });

そして、アダプターで適切なコードを次のように囲みます。

if (!isScrolling) {
    // processor intensiver code here
}
于 2012-12-17T15:48:42.927 に答える
0

実際にビューのリサイクルを使用していることがわかったので、もう 1 つのオプションは、リスト内の行数を制限することです。これは、 Pull to Refreshと呼ばれる一般的なライブラリを使用して実行できるため、1 ページに 10 ~ 20 行を配置し、ユーザーがプルしたときにさらに 10 ~ 20 行を読み込むことができるため、UI が遅くなることはありません。

于 2012-12-17T15:47:40.177 に答える
-1

データをビューにバインドする方法が最適化されていない可能性があります。つまり、リストビューに表示したい 1000 行のデータがある場合は、1000 ビューを作成して各行を表示する必要はありません。リストビューは画面に表示できるビューの量のみを表示するため、Android は画面からスクロールアウトされたビューを再利用するスマートなことを行います。データをバインドするときに、データをビューにバインドするメソッドに渡されるビューパラメータはnullです。その場合は新しいものを作成し、再利用しない場合は作成します。

理解を深めるには、次のビデオをご覧ください: http://www.youtube.com/watch?v=wDBM6wVEO70

于 2012-12-17T15:38:47.237 に答える