【问题标题】:ListView : Setting SimpleCursorAdapter overwrites current ContentViewListView : 设置 SimpleCursorAdapter 会覆盖当前的 ContentView
【发布时间】:2011-07-31 06:35:11
【问题描述】:

我对 Android SDK 非常陌生,但我已经设法创建了仪表板布局,现在我正在构建每个仪表板按钮后面的活动类/布局。我有点击事件触发和启动相关的按钮活动等(每个按钮 1 个动作)。我还在每个活动布局上都有一个标题栏,允许导航回主仪表板、设置等。基本外观。到目前为止,一切都很好。我现在尝试在活动布局上使用 ListView 来显示来自本地数据库(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>

// 站点行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"/>  

【问题讨论】:

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


    【解决方案1】:

    我想我明白了。问题出在我的 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);
        }
    

    我不确定这是否是我想要完成的“最佳”方法,因此我们将非常感谢任何/所有反馈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多