加载数据库的 Android ListView 非常慢

标签 android listview adapter

我有一个不是很大的真实数据库,为 ListView 适配器创建一个类,我在其中显示图像和一个人名字符串。我的问题是加载速度非常慢,加载 5 条记录大约需要 2 到 5 分钟,在其他情况下,数据库最多可以有 1000 条数据,这将是非常有问题的。我离开了类及其加载方式,看看我是否可以提供帮助,或者是否有其他元素可以替换它。

public void cargarListView(){
    nueva = new database();
    SessionManager manager = new SessionManager();
    codigoEvento = manager.getValue(this,"codigoEvento");
    codigoUser = manager.getValue(this, "codigoUser");
    idInscripcionesDisponibles = nueva.inscripcionesEvento(this, codigoEvento);
    inscripcionesDisponibles = new String[idInscripcionesDisponibles.length];
    for (int i = 0; i < idInscripcionesDisponibles.length; i++) {
        if (manager.getValue(listasAsistentes.this, "checkin")!=null){
            codigo_checkin = nueva.codigoCheckin(listasAsistentes.this, manager.getValue(listasAsistentes.this, "checkin"));
            if(nueva.checkinValidado(listasAsistentes.this,  idInscripcionesDisponibles[i], codigo_checkin)>0){
                inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
                RowItem item = new RowItem(images[0], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
                rowItems.add(item);
            }else{
                inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
                RowItem item = new RowItem(images[1], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
                rowItems.add(item);
            }
        }else{
            if(nueva.validadoInscripcion(listasAsistentes.this, idInscripcionesDisponibles[i], codigoEvento).equals("1")){
                inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
                RowItem item = new RowItem(images[0], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
                rowItems.add(item);
            }else{
                inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
                RowItem item = new RowItem(images[1], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
                rowItems.add(item);
            }
        }
    }
}




public void cargarLista(){
    nueva = new database();
    SessionManager manager = new SessionManager();
    codigoEvento = manager.getValue(this,"codigoEvento");

    codigoUser = manager.getValue(this, "codigoUser");
    checkin = (TextView) findViewById(R.id.textView6);
    nombreEventoTxt = (TextView) findViewById(R.id.textView3);
    sincronizarBD= (Button) findViewById(R.id.button1);
    nombreEvento = manager.getValue(this, "nombreEvento");
    nombreEventoTxt.setText(nombreEvento);
    if (manager.getValue(listasAsistentes.this, "checkin")!=null){
        checkin.setText("Check-In: "+nueva.nombreCheckin(listasAsistentes.this, manager.getValue(listasAsistentes.this, "checkin")));
    }else{
        checkin.setText("Check-In: General");
    }
    System.out.println("ITEMS : "+rowItems.size());
    inputSearch = (EditText) findViewById(R.id.EditText01);
    if(rowItems.size() <1){
        sincronizarBD.setVisibility(View.VISIBLE);
        inputSearch.setVisibility(View.GONE);
        RelativeLayout rl = (RelativeLayout) findViewById(R.id.linearLayout1);
        noHayAsistentes = new TextView(listasAsistentes.this); 
        noHayAsistentes.setText("No existen asistentes descargados, por favor sincronizar.");
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int)LayoutParams.WRAP_CONTENT, (int)LayoutParams.WRAP_CONTENT);
        params.topMargin = 300;
        params.leftMargin = 10;
        noHayAsistentes.setGravity(Gravity.CENTER);
        noHayAsistentes.setTextSize((float) 14);
        noHayAsistentes.setLayoutParams(params);
        rl.addView(noHayAsistentes);
    }else{
        inputSearch.setVisibility(View.VISIBLE);
        listView = (ListView) findViewById(R.id.listView1);
        adapter = new CustomListViewAdapter(this,R.layout.lista, rowItems);
        listView.setAdapter(adapter);
        inputSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                cs = cs.toString().toLowerCase();
                cs = cs.toString().replace ('á','a');
                cs = cs.toString().replace ('é','e');
                cs = cs.toString().replace ('í','i');
                cs = cs.toString().replace ('ó','o');
                cs = cs.toString().replace ('ú','u');
                listasAsistentes.this.adapter.getFilter().filter(cs.toString().trim());   
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });
        adapter = new CustomListViewAdapter(this,
                R.layout.lista, rowItems);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                listasAsistentes.this.adapter.getItem(position);
                System.out.println("ID ITEM:"+listasAsistentes.this.adapter.getItem(position).getInscripcionId());
                SessionManager manager = new SessionManager();
                //String idSeleccionada = idInscripcionesDisponibles[position];
                manager.setValue(listasAsistentes.this,"idInscripcionSeleccionada", String.valueOf(listasAsistentes.this.adapter.getItem(position).getInscripcionId()));
                nueva.inscripcionSeleccionada(listasAsistentes.this, String.valueOf(listasAsistentes.this.adapter.getItem(position).getInscripcionId()));
                menu();
            }
        });
    }
}

最佳答案

我猜您没有正确索引您的字段。

至少那些属于 JOIN 的字段和那些属于 WHERE 条件的字段必须被索引。

您将获得显着的性能提升,最高可达 100 秒 倍(根据经验确定,我的速度提升了大约 350 倍)。

要了解如何为字段编制索引,我向您推荐这个非常好的教程:http://www.tutorialspoint.com/sqlite/sqlite_indexes.htm

简而言之(该教程的极其综合的摘录),
在创建表后添加这些说明:

CREATE INDEX index_name ON table_name (column_name);

为每个你想创建的索引

通过使用 IF NOT EXISTS 结构,您将避免重新创建索引(如果已经存在)。

即:

CREATE INDEX IF NOT EXISTS idxID ON your_table_name (_id);
CREATE INDEX IF NOT EXISTS idxSearch ON your_table_name (a_field_used_in_searches);

关于加载数据库的 Android ListView 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25082404/

相关文章:

java - 即使完成 Activity 后也无法停止 MusicPlayer。

android - ListView - 在点击时显示详细信息,toast 不显示

android - 我们可以在 Android 中将 ListView 添加到 RemoteView 吗?

android - 数组适配器 : Change resource depending on item (Android)

android - 最佳实践 : Runtime filters with Room and LiveData

android - 为多个按钮设置相同的动画

android - 在 Android 应用程序中创建 Activity 之间的平滑过渡

c# - 在 ListView 中访问 ProgressBar

java - 如何从 ListView 中引用元素内的 View ?

android - 过滤自定义ArrayAdapter或在 Activity 中实现搜索