我有一个不是很大的真实数据库,为 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/