1. Do wyświetlania cursor'a, czyli informacji z bazy danych wykorzystuj ListView i CursorAdapter/SimpleCursorAdapter. Wyobrażasz sobie jak twój kod będzie funkcjonować np. przy 120 elementach? Lagi straszne. ListView stosuje sprytną magię. Pomimo tego, że lista zawiera bardzo dużo elementów to tak na prawdę wyświetlane jest tylko ~8 elementów, które są widoczne na ekranie. Gdy ekran zjeźdza na dół/góry to widok z dołu/góry jest zabierany i dodawany na górę/dół.
2. Do połączenia z bazą danych dobrze jest utworzyć♥contentProvider, co ułatwia o wiele tworzenie jej obsługę.
3. Jak już chcesz tworzyć dziwne stwory do obsługi bazy danych to zwracaj z nich już konkretne obiekty np. RoomItem, czy EntryItem, WpisItem lub tablice/listy tych obiektów.
Twój kod jest mega nie wydajny i nie optymalny.
Dla porównaniu podam ci kod z jakiegoś mojego projektu, który wykorzystuje contentProvider.
Kod wyświetla tylko listę elementów, ale wykorzystuje do tego Loadery, a więc wszystko jest wykonywane w miarę optymalnie. Nie wykonuje zapytań do bazy danych na wątku UI.
package pl.com.android.timetable;
import android.support.v4.content.CursorLoader;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import pl.com.android.timetable.provider.ContractProvider.Rooms;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
public class RoomsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final String[] from = new String[] { Rooms.ROOM_NAME };
final int[] to = new int[] { android.R.id.text1 };
mAdapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_1, null, from,
to, 0);
setListAdapter(mAdapter);
getLoaderManager().restartLoader(RoomsQuery.TOKEN, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new CursorLoader(getActivity(), Rooms.CONTENT_URI, RoomsQuery.PROJECTION, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
mAdapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
}
@SuppressWarnings("unused")
private interface RoomsQuery {
int TOKEN = 1;
String[] PROJECTION = new String[] { Rooms._ID, Rooms.ROOM_NAME };
int COLUMN_ID = 0;
int COLUMN_NAME = 1;
}
}