Search code examples
androidsimplecursoradapter

Custom SimpleCursorAdapter not displaying data on screen


I've read and tried a dozen solutions from this forum but none of them seem to work - I cannot display data on my lists - view.findViewById(resourceid) returns null each time in bindView - for example when using TextView t = (TextView) view.findViewById(R.id.leftCell). It is strange behaviour considering i have no errors in Logcat, and the view itself isn't null. What am I doing wrong?

I've divided my layout as follows: two LinearLayouts each wrapping a ListView. I've defined a custom row structure for both lists, found in database_item.xml and list_item.xml.

Here's my code.

Main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:id="@+id/topFrame">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Devices loaded from Database: "></TextView>
        <TableLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:stretchColumns="1">
            <TableRow>
                <TextView android:text="Name"
                android:padding="3dip"
                android:gravity="center"/>
                <TextView android:text="Remote Address"
                android:padding="3dip"
                android:gravity="center"/>
                <TextView android:text="Type"
                android:padding="3dip"
                android:gravity="center"/>
            </TableRow>
        </TableLayout>
    <ListView android:id="@+id/databaseList"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
    </ListView>
</LinearLayout>
<LinearLayout android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1.2"
    android:id="@+id/bottomFrame">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Detected Xbee nodes via 'introduce' command:"></TextView>
        <TableLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:stretchColumns="1">
            <TableRow>
                <TextView android:text="Address"
                android:padding="3dip"
                android:gravity="center"/>
                <TextView android:text="Type"
                android:padding="3dip"
                android:gravity="center"/>
            </TableRow>
        </TableLayout>
    <ListView android:id="@+id/detectedNodesList"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
    </ListView>
</LinearLayout>

database_item.xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
    <CheckBox android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:id="@+id/checkBox"></CheckBox>
    <TextView android:id="@+id/topLeftCell"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="3dip"
        android:gravity="center"></TextView>
    <TextView android:id="@+id/topCenterCell"
        android:padding="3dip"
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></TextView>
    <TextView android:id="@+id/topRightCell"
        android:gravity="center"
        android:padding="3dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></TextView>
</TableRow>     
</TableLayout>

list_item.xml:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1">
<TableRow>
    <TextView android:id="@+id/leftCell"
        android:padding="3dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></TextView>
    <TextView android:id="@+id/rightCell"
        android:gravity="left"
        android:padding="3dip"
        android:text="TESTING"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></TextView>
</TableRow>     

Relevant code from onCreate:

ListView topList = (ListView) findViewById(R.id.databaseList);
ListView bottomList = (ListView) findViewById(R.id.detectedNodesList);
String[] topColumns = new String[] {"name", "my", "type"};
    String[] bottomColumns = new String[] {"my","type"};

    int[] toTop = new int[] { R.id.topLeftCell, R.id.topCenterCell, R.id.topRightCell};
    int[] toBottom = new int[] { R.id.leftCell, R.id.rightCell};

    DbCursorAdapter e = new DbCursorAdapter(this, R.layout.database_item, cursor, topColumns, toTop);
    DbCursorAdapter d = new DbCursorAdapter(this, R.layout.list_item, cursor, bottomColumns, toBottom);

    topList.setAdapter(e);
    bottomList.setAdapter(d);

and DbCursorAdapter.java:

public class DbCursorAdapter extends SimpleCursorAdapter {
private Context context;
private int layout;
private final String TAG = "DbCursorAdapter";
LayoutInflater inflater;

public DbCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) {
    super(context,layout,c,from,to);
    this.context = context;
    this.layout = layout;
    inflater = LayoutInflater.from(context);

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View v = inflater.inflate(layout, parent, false);
    return v;
} 

@Override
public void bindView(View view, Context context, Cursor cursor) {
    Cursor c = cursor;
    if (layout == R.layout.list_item) {
        int addressCol = c.getColumnIndex("my");
        int typeCol = c.getColumnIndex("type");
        int address = c.getInt(addressCol);
        int type = c.getInt(typeCol);
        TextView t = (TextView) view.findViewById(R.id.leftCell);
        TextView t2 = (TextView) view.findViewById(R.id.rightCell);
        if (t != null) {
            t.setText(Integer.toString(address));
        } 
        if (t2 != null) {
            t2.setText(Integer.toString(type));
        }
    }
    if (layout == R.layout.database_item) {
        int nameCol = c.getColumnIndex("name");
        int addressCol = c.getColumnIndex("my");
        int typeCol = c.getColumnIndex("type");
        String name = c.getString(nameCol);
        int my = c.getInt(addressCol);
        int type = c.getInt(typeCol);
        CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox);
        checkBox.setVisibility(CheckBox.VISIBLE);
        TextView t = (TextView) view.findViewById(R.id.topLeftCell);
        TextView t2 = (TextView) view.findViewById(R.id.topCenterCell);
        TextView t3 = (TextView) view.findViewById(R.id.topRightCell);
        if (t != null) {
            t.setText(name);
        }
        if (t2 != null) {
            t2.setText(Integer.toString(my));
        }
        if (t3 != null) {
            t3.setText(Integer.toString(type));
        }
    } 
}

Solution

  • Solved. The problem seemed to be in main.xml:

    <TableLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:stretchColumns="1">
            <TableRow>
                <TextView android:text="Name"
                android:padding="3dip"
                android:gravity="center"/>
                <TextView android:text="Remote Address"
                android:padding="3dip"
                android:gravity="center"/>
                <TextView android:text="Type"
                android:padding="3dip"
                android:gravity="center"/>
            </TableRow>
        </TableLayout>
    

    Somehow covered the ListView that was supposed to be below it for both the top frame and the bottom frame. Removing TableLayout shows both lists just fine.

    Would anybody be able to explain why?