0

我在 android 中使用 ListView,我有一个扩展 ListActivity 的简单类。

每当我将 xml 文件中的 ListView 的名称更改为其他名称时,android:list我的程序就会崩溃。

这是我的 ListActivity 代码:

private NewExpenseScreenModel mDbAdabter;

    String[] items = { "Category", "Month", "Year"};
       /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.statistics);

        Spinner spinner = (Spinner) findViewById(R.id.spinner);

        ArrayAdapter adapter = new ArrayAdapter(
                this,
                android.R.layout.simple_spinner_item, 
                items);

        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        mDbAdabter = new NewExpenseScreenModel(this);

        populateFields();


    }

    private void populateFields() 
    {
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spending_row, mDbAdabter.getAllCategories());
        setListAdapter(adapter);
    }

这是我的 xml 文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:padding="10dip"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

    <Spinner
       android:id="@+id/spinner"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:prompt="@string/spinner_title"
   />
    <ListView android:id="@+id/android:list" android:layout_height="wrap_content"  android:layout_width="match_parent"></ListView>
</LinearLayout>

知道发生了什么.. 我想稍后实现一个 onItemClickedListener 所以我希望能够通过 id 找到 ListView。我真的不明白为什么我不能只更改 id

附加信息:

我还有另一个类,它使用不同的 xml 文件,列表 id="android:list" 但我永远不需要按 id 找到该 listView,所以它不是问题。另一个类使用相同的 xml 文件来描述每一行的布局。

更新:

我设法通过使用findViewById(android.R.id.list);而不是访问ID,findViewById(R.id.list);但我仍然不明白为什么它不会让我重命名列表

4

3 回答 3

1

列表视图 ID 应该是@android:id/list.

在定义新 id 时使用+in id。由于您使用的 ListView id 应该有list,并且listid 已经在内部定义,所以不需要添加+.

已编辑

当您从ListActivity. 请参阅@Mejonzhan 回答为什么会这样。

现在,如果您想要自己的 id 或想要拥有多个 List View,则不要扩展 ListActivity 而是扩展 Activity 并按如下方式处理 ListView:

更改 id 如下:

<ListView android:id="@+id/myListView"

在代码中,访问列表视图如下:

ListView myListView = (ListView) findViewById(R.id.myListView)

于 2012-08-08T00:47:55.790 回答
0

试试这个ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item_1, items);,代替`ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, items);`

于 2012-08-04T10:14:29.647 回答
0

ListActivity有一个默认布局,它由屏幕中央的单个全屏列表组成。但是,如果您愿意,您可以通过在 onCreate() 中使用 setContentView() 设置您自己的视图布局来自定义屏幕布局。为此,您自己的视图必须包含一个 ID 为“@android:id/list”的 ListView 对象(如果它在代码中,则为列表)

ListActivity 扩展Activity,可以搜索源码,找到ListActivity,找到函数:

public void onContentChanged() {
239        super.onContentChanged();
240        View emptyView = findViewById(com.android.internal.R.id.empty);
241        mList = (ListView)findViewById(com.android.internal.R.id.list);
242        if (mList == null) {
243            throw new RuntimeException(
244                    "Your content must have a ListView whose id attribute is " +
245                    "'android.R.id.list'");
246        }
247        if (emptyView != null) {
248            mList.setEmptyView(emptyView);
249        }
250        mList.setOnItemClickListener(mOnClickListener);
251        if (mFinishedStart) {
252            setListAdapter(mAdapter);
253        }
254        mHandler.post(mRequestFocus);
255        mFinishedStart = true;
256    }

在第 241 行中 mList = (ListView)findViewById(com.android.internal.R.id.list); 所以你不能改变列表名称

于 2012-08-08T00:46:36.450 回答