自定义SimpleCursorAdapter不在屏幕上显示数据

时间:2011-11-03 18:47:38

标签: android simplecursoradapter

我已经阅读并尝试了这个论坛的十几个解决方案,但它们似乎都没有工作 - 我无法在我的列表中显示数据 - view.findViewById(resourceid)每次在bindView中都返回null - 例如当使用TextView时=(TextView)view.findViewById(R.id.leftCell)。考虑到我在Logcat中没有错误,并且视图本身不为空,这是奇怪的行为。我做错了什么?

我按如下方式划分了我的布局:两个LinearLayouts,每个包装一个ListView。我为这两个列表定义了一个自定义行结构,可以在database_item.xml和list_item.xml中找到。

这是我的代码。

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>     

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);

和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));
        }
    } 
}

3 个答案:

答案 0 :(得分:0)

if (layout == R.layout.list_item)

访问资源ID的正确方法是

int list_item_id = context.getResources.getIdentifier(list_item,"layout", getPackageName());
if (layout == list_item_id)

这将返回R.layout.list_item的资源ID。我想告诉你,但我不知道这是不是确切的问题。

答案 1 :(得分:0)

就像Yashwanth一样,我的直觉告诉我if(layout==R.layout.list_item)的某些事情。您是否考虑过为每个列表使用单独的适配器?

答案 2 :(得分:0)

解决。问题似乎在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>

以某种方式覆盖了顶层框架和底部框架下面应该位于其下方的ListView。删除TableLayout显示两个列表都没问题。

有人能够解释原因吗?