ListView:设置SimpleCursorAdapter会覆盖当前的ContentView

时间:2011-07-31 06:35:12

标签: android android-listview android-2.2-froyo

我对Android SDK很新,但我设法创建了一个Dashboard布局,现在我正在构建每个仪表板按钮后面的活动类/布局。我有点击事件触发&启动相关的按钮活动等(每个按钮1次)。我还在每个活动布局上都有一个标题栏,允许导航回主仪表板,设置等。基本外观&感觉。到目前为止,所有人都一直很努力。我现在正尝试在活动布局上使用ListView来显示来自本地db(sqlite)的数据。

在我的onCreate()方法中,我使用SimpleCursorAdapter尝试将游标(SQL结果)绑定到布局中的ListView。我实际上是根据我之前做的教程(记事本)使用2个布局。第二种布局是针对光标中存在的每个“行”。问题是,一旦我将SimpleCursorAdapter中的布局设置为第二个布局,我就会在第一个布局中丢失标题栏功能。显然,如果我尝试在第二个布局中复制标题栏代码,它将与光标中的每个实例重复。

此外 - 我的所有“子”活动类都继承自继承自Activity的基类(FunDashboardActivity)。由于我的设计,我不能在这里使用ListActivity作为基类。再一次 - 我对Android完全不熟悉,非常感谢任何反馈/帮助。先感谢您。

这是我的活动代码:

public class FunSitesActivity extends FunDashboardActivity {

    private int mSiteNumber = 1;
    private FunDbAdapter mDbHelper;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_sites);
        mDbHelper = new FunDbAdapter(this);
        mDbHelper.open();
        fillData();
    }

    private void fillData() {

        // Get Site Data Stored
        Cursor c = mDbHelper.fetchAllSites();
        startManagingCursor(c);

        // Create Cursor Adapter
        String[] from = new String[] { FunDbAdapter.KEY_SITE };
        int[] to = new int[] { R.id.text1 };
        SimpleCursorAdapter notes =
            new SimpleCursorAdapter(this, R.layout.site_row, c, from, to);

        // Create ListView & Set Cursor
        ListView lv = new ListView(this);
        lv.setAdapter(notes);
        setContentView(lv);  
    }

// act_site xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout style="@style/TitleBar">
        <ImageButton style="@style/TitleBarAction"
            android:src="@drawable/title_home"
            android:contentDescription="@string/description_about"
            android:onClick="onClickHome" />
        <ImageView style="@style/TitleBarSeparator" />
        <TextView style="@style/TitleBarText" />
        <ImageButton style="@style/TitleBarAction"
            android:contentDescription="@string/description_config"
            android:src="@drawable/title_config"
            android:onClick="onClickConfig" />
        <ImageButton style="@style/TitleBarAction"
            android:contentDescription="@string/description_about"
            android:src="@drawable/title_about"
            android:onClick="onClickAbout" />
    </LinearLayout>

    <ListView 
        android:id="@+id/sitelist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView 
        android:id="@+id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/no_sites"/>
</LinearLayout>

// site_row xml

<?xml version="1.0" encoding="utf-8"?>
    <TextView android:id="@+id/text1"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>  

1 个答案:

答案 0 :(得分:0)

我想我明白了。问题出在我的fillData方法中,我将contentView设置为新的ListView实例。请参阅下面的新代码

    private void fillData() {

        // Get Site Data Stored
        Cursor c = mDbHelper.fetchAllSites();
        startManagingCursor(c);

        // Create Cursor Adapter
        String[] from = new String[] { JAMDbAdapter.KEY_SITE };
        int[] to = new int[] { R.id.text1 };
        SimpleCursorAdapter notes =
            new SimpleCursorAdapter(this, R.layout.site_row, c, from, to);

        // Create ListView & Set Cursor 
        // NEW APPROACH
        ListView lv = (ListView) findViewById(R.id.sitelist);
        lv.setAdapter(notes);

        // OLD APPROACH
        //ListView lv = new ListView(this);
        //lv.setAdapter(notes);
        //setContentView(lv);
    }

我不确定这是否是我想要完成的“最佳”方法,所以任何/所有反馈都会非常感激。