0

我有一个数据库。例如,它包含两个表:部门和员工。两张表都有很多东西。数据将填充到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方法中拉动光标/运行查询......这可能是您速度变慢的原因,因为您正在为列表中可见的每个视图执行此操作,然后在滚动时再次为每个视图执行此操作。

如果你必须这样做,那就聪明地去做。在停止滚动之前不要拉光标。放入一个滚动监听器和一个标志。滚动时,将标志设置为 true 并将适配器的那些数据密集位包含在一个if语句中,该语句将在设置标志时跳过它们。完成滚动后,清除标志并使用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

看到您实际上正在使用视图回收,另一个选项是限制列表中的行数。这可以使用一个名为Pull to Refresh的流行库来完成,因此您可以在单个页面中放置 10-20 行,然后当用户拉动时,您可以再加载 10-20 行,因此 UI 不会变慢。

于 2012-12-17T15:47:40.177 回答
-1

也许您将数据绑定到视图的方式没有优化,即您可能有 1000 行数据要在列表视图中显示,您不需要创建 1000 个视图来显示您的每一行数据,因为列表视图只会显示屏幕中可以看到的视图数量,所以 android 做了一个聪明的事情,就是重用已经滚动出屏幕的视图,当你绑定你的数据时,你应该检查是否传递给将数据绑定到视图的方法的视图参数为空,如果是,则创建新的,如果不重用它。

为了更好地理解观看此视频:http ://www.youtube.com/watch?v=wDBM6wVEO70

于 2012-12-17T15:38:47.237 回答