2011-11-03 115 views
1

数据我已经阅读并试图从这个论坛十几个解决方案,但没有人似乎工作 - 我不能在我的列表中显示的数据 - view.findViewById(RESOURCEID)在bindView空每次返回 - 例如,当使用TextView t =(TextView)view.findViewById(R.id.leftCell)时。这是奇怪的行为,考虑到我在Logcat中没有错误,并且视图本身不为空。我究竟做错了什么? 2个LinearLayouts每个缠绕一个ListView:定制SimpleCursorAdapter不显示在屏幕上

如下我将我的布局。我已经为这两个列表定义了一个自定义行结构,可以在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)); 
     } 
    } 
} 
+0

这可能会帮助: http://stackoverflow.com/questions/1832290/android-id-naming-convention-lower-case-with-underscore-vs-camel-case – lyschoening

回答

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显示两个列表都很好。

会有人能够解释,为什么?

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。我想让你知道,但我不知道这是否是确切的问题。

+0

文档说这有关您建议的方法: “注意:不鼓励使用此功能。通过标识符而不是名称检索资源效率更高。” 这就是说 - 中频选择否则工作。取决于它是一个database_item还是一个list_item,它将通过正确的选择。 –

0

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

+0

两个独立的适配器是一个选项 - 我会尝试下一步。使用单个类来处理这两个(相对简单的)情况会更简单。 –

+0

好 - 现在使用两个独立的适配器。 TextView不再为空。但是,该活动仍然不会在列表中显示数据。我试图在两个应该填充屏幕的TextView中做t.setText(“test”)。在logcat中调试显示每次调用setText。然而没有任何东西显示在名单上 –

+0

它不显示任何一个列表中的数据,或者只是其中的一个? –