CursorAdapter滑动缓慢/卡顿

3
我有一个ListActivity,使用CursorAdapter以表格格式绘制数据集。我最初使用了TableLayout(并绘制了整个表格),但我担心这会使用太多内存(并且绘制页面很慢),因此现在正在研究使用CursorAdapter。
活动主体的XML布局如下所示(请注意使用HorizontalScrollView,这可能是一个原因):
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/layout_query_viewer">

    <TextView
        android:id="@+id/query_table_name"
        style="@style/ActivityTitle" />

    <HorizontalScrollView
        android:id="@+id/hsvMainContent"
        android:scrollbars="none"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <LinearLayout
            android:id="@+id/llMainContent"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <LinearLayout
                android:id="@+id/fixed_headers"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />

            <ListView
                android:id="@android:id/android:list"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"/>
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

CursorAdapter看起来像这样:
private class QueryAdapter extends CursorAdapter {
    public QueryAdapter(Context context) {
        super(context, null);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        /*
         * I'm deliberately not inflating here as I'm synchronizing a remote
         * database, so I don't know how many columns my query will return.
         */
        LinearLayout layout = new LinearLayout(context);
        ViewHolder holder = new ViewHolder(cursor.getColumnCount());
        layout.setTag(holder);

        for (int i = 1; i < cursor.getColumnCount(); i++) {
            TextView cell = new TextView(context);

            holder.cells[i] = cell;

            cell.setBackgroundColor(Color.WHITE);
            cell.setMinimumWidth(mColumnWidths[i]);
            cell.setPadding(1, 1, 1, 1);

            layout.addView(cell);
        }

        return layout;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ViewHolder holder = (ViewHolder)view.getTag();

        for (int i = 1; i < cursor.getColumnCount(); i++) {
            holder.cells[i].setText(cursor.getString(i));
        }
    }
}

static class ViewHolder {
    TextView[] cells;

    public ViewHolder(int size) {
        cells = new TextView[size];
    }
}

当我绘制整个表格时,滚动性能良好,但现在我已经切换到CursorAdapter后,滚动变得很卡顿(我指的是无法接受的卡顿)。从架构上看,CursorAdapter方法似乎是正确的决策,但除非我能解决滚动问题,否则我将不得不回到绘制整个表格。

是否有其他人遇到过这个问题或者能够说明我做错了什么?

1个回答

1
我从Android市场下载了“SQLite Editor”(由Speed Software开发),并注意到他们的表格渲染非常流畅。我联系了开发人员,他们很友好地指引了我正确的方向。
最终,我使用画布并在自定义视图中绘制表格。这并没有比实现CursorAdapter解决方案花费更多的时间。

1
我们在 Android TweetDeck 上也做了同样的事情。Android 的标准 ListView 组件真是一堆烂摊子。 - mxcl
1
你能分享一些关于你是如何做到这一点的高层次细节吗?谢谢! - ahmedre
我很好奇听到关于这个的一些指针。我有完全相同的问题。 - jannej
@jannej 这可能会有所帮助?你的列表视图项内容是什么?有一种非常有用的方法可以使其运行顺畅。我曾经遇到过类似的问题。但是在实施了我所说的程序之后,列表视图变得非常快,并且卡顿的问题停止了。 - Sunday G Akinsete
我遇到了与 OP 完全相同的问题。解决方法是在绑定时间为我的代码进行数据查询异步操作。(异步任务获取数据,并在视图上设置结果,如果视图仍然有效用于绑定(未被重用以针对另一个游标行进行绑定)。现在滚动非常顺畅。 - Diederik
我要发表评论,即使这篇文章已经很老了,因为如果有人建议这个,那么这将节省我大量的时间。对我来说,问题出在我的适配器上。最终找到了一个非常简单的解决方法/发现。我注释掉了适配器中的所有代码,只显示了一个简单的文本视图。我的应用程序运行得非常快。然后我逐一取消注释,直到找到错误的代码。我在每一行上都进行了运行时计算,真是太愚蠢了!当我使用ArrayAdapter时,这并不明显,但是一旦我切换到使用CursorAdapter时,滚动就变得非常卡顿。希望这可以帮助到您。 - SammyT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接