我在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,但我仍然不明白为什么它不会让我重命名列表
答案 0 :(得分:1)
列表视图ID应为@android:id/list
。
定义新ID时,在ID中使用+
。由于您使用的是列表视图的ListView ID,因此内部已定义list
和list
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); 所以你不能改变名单