ListView在setOnItemClickListener上产生nullpointerexception

我正在尝试使用一些教程代码并添加一个OnItemClick侦听器,但在它击中侦听器并使我的应用程序崩溃时继续抛出exception。 这是我在Android环境中工作的第一次尝试,所以我试图了解所有这些事情是如何相互关联的。

这是我尝试过的:

import java.util.ArrayList; import java.util.List; import org.json.JSONObject; import android.app.AlertDialog; import android.app.ListActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class RssActivity extends ListActivity{ private RssListAdapter adapter; private OnItemClickListener newsSelectListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { AlertDialog.Builder alert=new AlertDialog.Builder(RssActivity.this); alert.setTitle("Clicked").setMessage("Item clicked").setNeutralButton("OK", null).show(); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); List jobs = new ArrayList(); try { jobs = RssReader.getLatestRssFeed(); } catch (Exception e) { Log.e("RSS ERROR", "Error loading RSS Feed Stream >> " + e.getMessage() + " //" + e.toString()); } adapter = new RssListAdapter(this,jobs); setListAdapter(adapter); ListView lv = (ListView)findViewById(R.id.list); lv.setOnItemClickListener(newsSelectListener); } } 

我还尝试将setListAdapter更改为lv.setListAdapter,但这似乎不是一个有效的语句。

我错过了什么?

ListActivity不要求你通过setContentView()分配布局,如果你只想显示一个列表但是如果你添加另一个视图,你的ListView应该包含设置为@android:id/listandroid:id属性@android:id/list like这个xml如下

   

尝试更改您的代码

ListView lv = (ListView)findViewById(R.id.list);

对此

 ListView lv = getListView(); lv.setOnItemClickListener(newsSelectListener); 

我不确定你的代码是否有用

 private OnItemClickListener newsSelectListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { AlertDialog.Builder alert=new AlertDialog.Builder(RssActivity.this); alert.setTitle("Clicked").setMessage("Item clicked").setNeutralButton("OK", null).show(); } }; 

但在我看来,我经常在Adapter类的getView方法中将setOnClickListener()添加到convertView中

 public View getView(final int position, View convertView, ViewGroup parent) { ...................... convertView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //Do Somethings in here } } }); 

我看不到你在哪里初始化你的布局…所以:

Activity类负责为您创建一个窗口,您可以在其中使用setContentView(View)放置UI。

onCreate(Bundle)方法初始化您的Activity 。 您通常使用xml布局调用setContentView(int)main.xml或定义UI的xml)。 把它super.onCreate(..)


关于这个例外:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{}: 

如果你的Activity已经存在,请检查你的AndroidManifest.xml

   

如果您的问题尚未解决,请使用您的Logcat并将Log.d放入您的方法中以查看它崩溃的位置。

编辑

好的 – 你在哪里设置setContentView(...)lv

 ListView lv = (ListView) findViewById(R.id.list); 

为null,因为您没有设置contentView。


可能原因是:您在setNeutralButton("OK", null)中的AlertDialog.Builder中将setNeutralButton("OK", null)设置为null

因此,当您单击“确定”时,Android会调用(内部)类似这样的内容:

 neutralButtonListener.onClick(...); 

neutralButtonListenernull 。 所以你应该至少提供空的监听器。