在xml文件中重命名ListView的问题

时间:2012-08-04 10:06:14

标签: android

我在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 =&#34; android:list&#34;但我永远不需要通过id找到listView,所以它不是问题。 另一个类使用相同的xml文件来描述每行的布局。

更新

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

3 个答案:

答案 0 :(得分:1)

列表视图ID应为@android:id/list

定义新ID时,在ID中使用+。由于您使用的是列表视图的ListView ID,因此内部已定义listlist ID,因此无需添加+

<强>被修改

当您从ListActivity扩展课程时,必须执行以上操作。请参阅@Mejonzhan回答为何如此。

现在,如果您想要自己的id或者想要拥有多个列表视图,那么不要扩展ListActivity而是扩展Activity并处理ListViews,如下所示:

更改ID如下:

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

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

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

答案 1 :(得分: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);`

答案 2 :(得分: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); 所以你不能改变名单