Android strange behavior with listview and custom cursor adapter
Posted
by
Michael Little
on Stack Overflow
See other posts from Stack Overflow
or by Michael Little
Published on 2010-12-24T05:04:36Z
Indexed on
2010/12/26
18:54 UTC
Read the original article
Hit count: 659
I have a problem with a list view and a custom cursor adapter and I just can't seem to figure out what is wrong with my code. Basically, in my activity I call initalize() that does a bunch of stuff to handle getting the proper data and initializing the listview. On first run of the activity you can see from the images that one of the items is missing from the list. If I go to another activity and go back to this activity the item that was missing shows up. I believe it has something to do with setContentView(R.layout.parent). If I move that to my initialize() then the item never shows up even when returning from another activity. So, for some reason, returning from another activity bypasses setContentView(R.layout.parent) and everything works fine. I know it's impossible for me to bypass setContentView(R.layout.parent) so I need to figure out what the problem is. Also, I did not include the layout because it is nothing more then two textviews.
Also, the images I have attached do not show that the missing item is the last one on the list.
Custom Cursor Adapter:
public class CustomCursorAdapter extends SimpleCursorAdapter {
private Context context;
private int layout;
public CustomCursorAdapter (Context context, int layout,
Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
this.context = context;
this.layout = layout;
}
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
final View view = inflater.inflate(layout, parent, false);
return view;
}
@Override
public void bindView(View v, Context context, Cursor c) {
if (c.getColumnName(0).matches("section")){
int nameCol = c.getColumnIndex("section");
String section = c.getString(nameCol);
TextView section_text = (TextView) v.findViewById(R.id.text1);
if ((section.length() > 0)) {
section_text.setText(section);
} else {
//so we don't have an empty spot
section_text.setText("");
section_text.setVisibility(2);
section_text.setHeight(1);
}
} else if (c.getColumnName(0).matches("code")) {
int nameCol = c.getColumnIndex("code");
String mCode = c.getString(nameCol);
TextView code_text = (TextView) v.findViewById(R.id.text1);
if (code_text != null) {
int i = 167;
byte[] data = {(byte) i};
String strSymbol = EncodingUtils.getString(data, "windows-1252");
mCode = strSymbol + " " + mCode;
code_text.setText(mCode);
code_text.setSingleLine();
}
}
if (c.getColumnName(1).matches("title")){
int nameCol = c.getColumnIndex("title");
String mTitle = c.getString(nameCol);
TextView title_text = (TextView) v.findViewById(R.id.text2);
if (title_text != null) {
title_text.setText(mTitle);
}
} else if (c.getColumnName(1).matches("excerpt")) {
int nameCol = c.getColumnIndex("excerpt");
String mExcerpt = c.getString(nameCol);
TextView excerpt_text = (TextView) v.findViewById(R.id.text2);
if (excerpt_text != null) {
excerpt_text.setText(mExcerpt);
excerpt_text.setSingleLine();
}
}
}
The Activity:
public class parent extends ListActivity {
private static String[] TITLE_FROM = { SECTION, TITLE, _ID, };
private static String[] CODE_FROM = { CODE, EXCERPT, _ID, };
private static String ORDER_BY = _ID + " ASC";
private static int[] TO = { R.id.text1, R.id.text2, };
String breadcrumb = null;
private MyData data;
private SQLiteDatabase db;
CharSequence parent_id = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
data = new MyData(this);
db = data.getReadableDatabase();
setContentView(R.layout.parent);
initialize();
}
public void initialize() {
breadcrumb = null;
Bundle bun = getIntent().getExtras();
TextView tvBreadCrumb;
tvBreadCrumb = (TextView)findViewById(R.id.breadcrumb);
if (bun == null) {
//this is the first run
tvBreadCrumb.setText(null);
tvBreadCrumb.setHeight(0);
parent_id = "0";
try {
Cursor cursor = getData(parent_id);
showSectionData(cursor);
} finally {
data.close();
}
} else {
CharSequence state = bun.getString("state");
breadcrumb = bun.getString("breadcrumb");
tvBreadCrumb.setText(breadcrumb);
CharSequence code = bun.getString("code");
parent_id = code;
if (state.equals("chapter")) {
try {
Cursor cursor = getData(parent_id);
showSectionData(cursor);
} finally {
data.close();
}
} else if (state.equals("code")) {
try {
Cursor cursor = getCodeData(parent_id);
showCodeData(cursor);
} finally {
data.close();
}
}
}
}
@Override
public void onStart() {
//initialize();
super.onResume();
}
@Override
public void onResume() {
initialize();
super.onResume();
}
private Cursor getData(CharSequence parent_id) {
Cursor cTitles = db.query(TITLES_TABLE_NAME, TITLE_FROM, "parent_id = " + parent_id, null, null, null, ORDER_BY);
Cursor cCodes = db.query(CODES_TABLE_NAME, CODE_FROM, "parent_id = " + parent_id, null, null, null, ORDER_BY);
Cursor[] c = {cTitles, cCodes};
Cursor cursor = new MergeCursor(c);
startManagingCursor(cursor);
return cursor;
}
private Cursor getCodeData(CharSequence parent_id2) {
Bundle bun = getIntent().getExtras();
CharSequence intent = bun.getString("intent");
CharSequence searchtype = bun.getString("searchtype");
//SQLiteDatabase db = data.getReadableDatabase();
if (intent != null) {
String sWhere = null;
if(searchtype.equals("code")) {
sWhere = "code LIKE '%"+parent_id2+"%'";
} else if(searchtype.equals("within")){
sWhere = "definition LIKE '%"+parent_id2+"%'";
}
//This is a search request
Cursor cursor = db.query(CODES_TABLE_NAME, CODE_FROM, sWhere, null, null, null, ORDER_BY);
startManagingCursor(cursor);
return cursor;
} else {
Cursor cursor = db.query(CODES_TABLE_NAME, CODE_FROM, "parent_id = "+ parent_id2, null, null, null, ORDER_BY);
startManagingCursor(cursor);
return cursor;
}
}
private void showSectionData(Cursor cursor) {
CustomCursorAdapter adapter= new CustomCursorAdapter(this, R.layout.item, cursor, TITLE_FROM, TO);
setListAdapter(adapter);
}
private void showCodeData(Cursor cursor) {
CustomCursorAdapter adapter = new CustomCursorAdapter(this, R.layout.item, cursor, CODE_FROM, TO);
setListAdapter(adapter);
Bundle bun = getIntent().getExtras();
CharSequence intent = bun.getString("intent");
if (intent != null) {
Cursor cursor1 = ((CursorAdapter)getListAdapter()).getCursor();
startManagingCursor(cursor1);
TextView tvBreadCrumb;
tvBreadCrumb = (TextView)findViewById(R.id.breadcrumb);
tvBreadCrumb.setText(cursor1.getCount() + " Records Found");
//cursor1.close(); //mdl
}
}
© Stack Overflow or respective owner