2012-06-12 221 views
1

我想让我的屏幕拥有标题的列表视图。带有标题的Android列表视图

在我的XML文件中,我有一个列表视图,上面有一个imageview,它被用作标题。

当我运行这个时,我得到一个错误。我经历了几十个教程,我看不出我做错了什么。我搜索了Stackoverflow,都尝试了解决方案,但没有喜悦。有人可以帮我吗?

注意:我使用Actionbarsherlock,所以我的类扩展了SherlockListActivity。我已经与ListActivity尝试了这一点,并得到同样的问题。我也尝试运行没有实例化图像,看看是否加载自己,并仍然得到相同的错误。

请参阅我的XML和代码如下:

我的XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<ImageView 
    android:id="@+id/headerimage" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:src="@drawable/header" > 
</ImageView> 

<ListView 
    android:id="@+id/mylist" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</ListView> 

我的代码:

public class MainActivity extends SherlockListActivity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ImageView header = (ImageView) findViewById(R.id.headerimage); 
    ListView listView = (ListView) findViewById(R.id.mylist); 
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
    "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
    "Linux", "OS/2" }; 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, android.R.id.text1, values); 

     listView.addHeaderView(header); 
    listView.setAdapter(adapter); 




} 

错误日志

E/AndroidRuntime(10642): FATAL EXCEPTION: main 
E/AndroidRuntime(10642): java.lang.RuntimeException: Unable to start activity ComponentInfo{ttj.android.t3w/ttj.android.t3w.MainActivity}: java.lang.NullPointerException 
E/AndroidRuntime(10642): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968) 
E/AndroidRuntime(10642): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 
E/AndroidRuntime(10642): at android.app.ActivityThread.access$600(ActivityThread.java:127) 
E/AndroidRuntime(10642): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 
E/AndroidRuntime(10642): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(10642): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(10642): at android.app.ActivityThread.main(ActivityThread.java:4507) 
E/AndroidRuntime(10642): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(10642): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(10642): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
E/AndroidRuntime(10642): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
E/AndroidRuntime(10642): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(10642): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(10642): at ttj.android.t3w.MainActivity.onCreate(MainActivity.java:40) 
E/AndroidRuntime(10642): at android.app.Activity.performCreate(Activity.java:4465) 
E/AndroidRuntime(10642): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
E/AndroidRuntime(10642): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
E/AndroidRuntime(10642): ... 11 more 
+0

而不是使用'findViewById'从文件中查找listview,在扩展ListActivity的类中使用'getListView()'。 – ataulm

回答

-1

固定的名字后立即打电话setContentView(R.layout.xmlfilename)

该活动不应扩展ListActivity。我将其更改为“活动”,问题消失了。

+0

-1使用ListView而不扩展ListActivity。将其重新更改为ListActivity,并在布局文件中将ListView的ID从“mylist”更改为“list”,因为该错误明确指出。 – ataulm

3

设置页眉和设置页脚采取膨胀版式。这意味着为标题创建一个单独的布局并对其进行扩展。与设置内容视图类似,但通胀不会自动发生。一方不在这里,但显然你需要在设置列表适配器之前设置页眉和页脚。当我得到一分钟后,我会尝试发布一些代码。

+0

super.onCreate(savedInstanceState);和setContentView(R.layout.main);是oncreate方法的前两行。我删除了它们,因为我读过的所有教程都没有。这是我的理解,listview不需要setContentView。无论哪种方式,我试着用它来运行代码,错误仍然存​​在 – tiptopjat

+0

您的权利...对不起,我忘记了这是一个listview活动。 – cstrutton

+0

当我使用setcontentview时,我得到以下错误:E/AndroidRuntime(17767):引起:java.lang.RuntimeException:你的内容必须有一个ListView的id属性是'android.R.id.list' – tiptopjat

2

cstrutton是对的。你不是叫setConentView 你应该调用super.onCreate(savedInstanceState);

哪里xmlfilename是你的布局文件

+0

我已经完成这个问题仍然存在。 – tiptopjat

0

setContentView(id)应与列表活动中使用,并且活性掺入ListView应该延伸ListActivityListFragment(或适当子类)。

在您的评论对cstrutton,你的状态:

When I use setcontentview I get the following error: E/AndroidRuntime(17767): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

这是因为你的ListView有一个不正确的ID - 在ListActivity,应该有一个最大的相关布局文件表示一个ListView,并且它的id应该是@android:id/list(大概是这样,Android知道ListView在哪里,尽管我不确定它为什么不能从元素标签中检测到它,可能出于性能方面的原因,它只需要一个特定的ID就可以)。

@+id/list更改为@android:id/list。(见this question为什么它@android:id而非@+id

我想还有其他原因使用扩展ListActivity类和他们中的很多将成为方便的方法,但我怀疑很多是最佳化。

向上和向上!