【问题标题】:CursorAdapter slow/jerky scrollCursorAdapter 缓慢/生涩的滚动
【发布时间】:2011-04-20 12:12:36
【问题描述】:

我有一个 ListActivity,它使用 CursorAdapter 以表格格式绘制数据集。我最初使用的是 TableLayout(并绘制了整个表格),但我担心这会占用太多内存(并且绘制页面很慢),所以我现在正在研究使用 CursorAdapter。

活动主体的 XML 布局如下所示(注意使用了 Horizo​​ntalScrollView,这可能是一个原因):

<?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 方法在架构上似乎在逻辑上是正确的决定,但除非我能解决滚动问题,否则我将不得不返回绘制整个表格。

有没有其他人经历过这种情况,或者可以阐明我做错了什么?

【问题讨论】:

    标签: android scroll listactivity android-cursoradapter


    【解决方案1】:

    我从 Android Market 下载了“SQLite Editor”(由 Speed Software 提供),并注意到他们的表格渲染非常流畅。我联系了开发人员,他们很友好地为我指明了正确的方向。

    我实际上最终使用了画布并在自定义视图中绘制表格。实施 CursorAdapter 解决方案所需的时间并不长。

    【讨论】:

    • 我们为 Android TweetDeck 做了同样的事情。 Android 的标准 ListView 组件是一堆垃圾。
    • 你能分享一些关于你做了什么的高级细节吗?谢谢!
    • 我很想听听一些关于这个的指针。有完全相同的问题。
    • @jannej 这可能有帮助吗?您的列表视图项目的内容是什么?有一种非常有用的方法可以让它顺利运行。我有类似的问题。但是在执行该程序之后,我所说的列表视图变得非常快,并且生涩的事情停止了。
    • 我刚刚遇到了与 OP 完全相同的问题。修复正在对我的代码在绑定时异步执行的数据进行查询。 (用于获取数据并在视图上设置结果的异步任务,如果视图仍可用于绑定(尚未被重用于绑定另一个游标行。)现在滚动很顺畅。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多