Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 针对大量数据的ListView和CursorAdapter的性能问题_Java_Android_Sqlite - Fatal编程技术网

Java 针对大量数据的ListView和CursorAdapter的性能问题

Java 针对大量数据的ListView和CursorAdapter的性能问题,java,android,sqlite,Java,Android,Sqlite,我在sqlite表中有大约4k行,该表有7列 我用自己的游标适配器创建了工作列表视图 查询如下SELECT*FROM[table]ORDER BY[column]DESC 表有第一列\u id INTEGER主键,但排序由另一列完成 用于使用我自己的SQLiteOpenHelper 创建光标 mySQLiteOpenHelper pm = new mySQLiteOpenHelper(); SQLiteDatabase db = pm.getReadableDatabase(); Cursor

我在sqlite表中有大约4k行,该表有7列

我用自己的游标适配器创建了工作列表视图

查询如下
SELECT*FROM[table]ORDER BY[column]DESC

表有第一列
\u id INTEGER主键
,但排序由另一列完成

用于使用我自己的
SQLiteOpenHelper

创建光标

mySQLiteOpenHelper pm = new mySQLiteOpenHelper();
SQLiteDatabase db = pm.getReadableDatabase();
Cursor c = db.query([tablename], new String[]{"_id", "[column]", "[column]", "[column]", "[column]", "[column]"}, null, null, null, null, "name ASC");
将其传递给ListView

ListView lv = (ListView) findViewById(R.id.list_items);
lv.setOnItemClickListener(this);
pa = new ItemsAdapter(ItemsActivity.this, c);
在ItemsAdapter中,我重新实现了

private LayoutInflater inflater;

@Override
public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
    return inflater.inflate(R.layout.items_row, arg2,false);
}

MyWrapClass

public final class MyWrapClass {

    public String name = "";
    public String notes = "";
    public int id = 0;
    public String catalogId = "";
    public int price = 0;
    public int publicPrice = 0;
    public String groupPrice = "";
    public int order_count = 0;

    public MyWrapClass(Cursor c) {
        try {
            id = c.getInt(0);
            catalogId = c.getString(1);
            name = c.getString(2);
            price = c.getInt(3);
            publicPrice = c.getInt(4);
            groupPrice = c.getString(5);
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }
}
ListView中使用了相同的行初始化代码,在那里它工作得非常好

那么,如果您可以从这段代码中说,有什么原因,为什么加载6行项目(一个屏幕高度)和滚动刷新(意味着向下滚动一个项目)需要1分钟


加载ListView最多需要2分钟,然后向下/向上滚动一个列表项大约需要一半时间。性能问题在哪里?

我将创建一个自定义的
适配器,它只加载活动视图所需的内容,并重用
getView()方法中的视图。这真的很简单

更新

我发现了一个很好的例子,您应该能够使用:

是否为活动视图?您的意思是只加载屏幕位置上的行+的数据?我怎样才能做到这一点?是的,没错。只需重用已创建的视图,并仅使用当前列表视图位置的数据填充它们。安卓工程师Romain Guy有一段很棒的视频。大约12分钟开始:您能在回答中添加什么代码,然后在
getView
newView
bindView
中添加吗?我会看的,但要把你的答案复杂化,这样我才能接受。因为
getView
不是强制重写的,但是
bindView
是肯定的,所以稍后我将添加一个更详细的答案。您不需要
newView()
bindView()
。请查看更新的答案。我添加了一个指向优秀教程的链接。如果你浏览光标并将元素添加到ArrayList中,你应该能够轻松地使用链接中的示例。为什么不使用日志记录来找到瓶颈?为什么有人对这两个答案都投了反对票?他们很有帮助@Arhimed您是什么意思?我的意思是您可以使用
Log
类在LogCat中查看在哪个部分花费了多少时间。
public final class MyWrapClass {

    public String name = "";
    public String notes = "";
    public int id = 0;
    public String catalogId = "";
    public int price = 0;
    public int publicPrice = 0;
    public String groupPrice = "";
    public int order_count = 0;

    public MyWrapClass(Cursor c) {
        try {
            id = c.getInt(0);
            catalogId = c.getString(1);
            name = c.getString(2);
            price = c.getInt(3);
            publicPrice = c.getInt(4);
            groupPrice = c.getString(5);
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }
}