2012-05-06 3 views
1

Привет, ребята У меня есть активность, которая расширяет 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; 
    } 

} 

} 
+0

hm, вы создаете 'SimpleCursorAdapter' на основе атрибута' cursor', который задается 'AsyncTask', запущенным в' #onCreate (..) '- это не очень * надежный * дизайн. – Jens

+0

Спасибо за комментарий. помогите объяснить, почему? (Я новичок в java \ android, поэтому хотел бы узнать больше) – Yosi199

+0

Поскольку задача async выполняется в отдельном потоке (в пуле потоков) - нет никакой реальной гарантии, что вы не создаете SimpleCursorAdapter с 'null' в поле 'cursor' (так как оно сначала назначено в' #doInBackground() 'вашей задачи async). – Jens

ответ

0

В конце концов, что мне нужно было класс ViewHolder вместе с GetView \ BindView.