Привет, ребята У меня есть активность, которая расширяет ListActivity и отображает список, который заполняется из моей таблицы SQLite DB.Как кэшировать данные из sqlite в listview?
Каждая запись в моем списке имеет тот же фоновый файл, что и часть моего графического интерфейса. Проблема в том, что прокрутка в моем списке очень лаги. Я думаю, это потому, что каждая запись списка создается «на лету», которая вызывает отставание.
Не могли бы вы посмотреть мой код и рассказать мне, как я могу кэшировать его для получения лучших результатов? Или, может быть, есть другое решение?
КОД:
package android.GUI;
public class Shifts extends ListActivity implements OnClickListener,
SimpleGestureListener {
private Typeface tf = Entry.tf, tf2 = Entry.tf2;
public static int count = 1;
int dbHourTime = 0;
private SimpleGestureFilter detector;
public static DBAdapter DB;
public static Cursor cursor;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.shifts);
detector = new SimpleGestureFilter(this, this);
DB = new DBAdapter(this);
DB.open();
String[] columns = new String[] { DB.KEY_DATE, DB.KEY_HOURS,
DB.KEY_DAY, DB.KEY_ROWID, DB.KEY_START, DB.KEY_END };
int[] to = new int[] { R.id.dateDisp, R.id.shiftDisp, R.id.day,
R.id.rawId, R.id.start, R.id.finish };
new cursorLoad().execute("this");
TextView SF = (TextView) findViewById(R.id.total);
SF.setTypeface(tf);
TextView sum = (TextView) findViewById(R.id.sum);
sum.setTypeface(tf);
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,
R.layout.list_entry, cursor, columns, to);
this.setListAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.view_shifts_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.back:
finish();
return true;
case R.id.clear:
DBAdapter DB = new DBAdapter(this);
DB.open();
DB.deleteAll();
startActivity(getIntent());
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
@Override
public void onSwipe(int direction) {
Intent intent = new Intent();
switch (direction) {
case SimpleGestureFilter.SWIPE_RIGHT:
intent.setClass(this, Main.class);
startActivity(intent);
break;
case SimpleGestureFilter.SWIPE_LEFT:
intent.setClass(this, Entry.class);
startActivity(intent);
break;
case SimpleGestureFilter.SWIPE_DOWN:
break;
case SimpleGestureFilter.SWIPE_UP:
break;
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent me) {
this.detector.onTouchEvent(me);
return super.dispatchTouchEvent(me);
}
@Override
public void onDoubleTap() {
// TODO Auto-generated method stub
}
public class cursorLoad extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
cursor = DB.getAllShifts();
startManagingCursor(cursor);
cursor.moveToLast();
count = cursor.getPosition();
int g = count;
cursor.moveToNext();
return null;
}
}
}
hm, вы создаете 'SimpleCursorAdapter' на основе атрибута' cursor', который задается 'AsyncTask', запущенным в' #onCreate (..) '- это не очень * надежный * дизайн. – Jens
Спасибо за комментарий. помогите объяснить, почему? (Я новичок в java \ android, поэтому хотел бы узнать больше) – Yosi199
Поскольку задача async выполняется в отдельном потоке (в пуле потоков) - нет никакой реальной гарантии, что вы не создаете SimpleCursorAdapter с 'null' в поле 'cursor' (так как оно сначала назначено в' #doInBackground() 'вашей задачи async). – Jens