用DB加载的Android listview非常慢

时间:2014-08-01 14:24:54

标签: 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();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

让我猜你没有正确地 INDEX 你的字段。

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

你会获得明显的性能提升,最快可达 100s 倍(我的速度增加约 350x ,根据经验确定)。

要了解如何索引字段,我建议您使用这个非常好的教程: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);