1

我正在尝试使用一些教程代码并添加一个 OnItemClick 侦听器,但是当它遇到侦听器并使我的应用程序崩溃时会继续抛出异常。这是我第一次尝试在 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<JSONObject> jobs = new ArrayList<JSONObject>();
    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,但这似乎不是一个有效的声明。

我错过了什么?

4

4 回答 4

3

ListActivity 不需要您分配布局setContentView(),如果您只想显示一个列表,但如果您添加另一个视图,您的 ListView 应该包含设置为喜欢下面这个 xml的android:id属性@android:id/list

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

尝试更改您的代码

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

对此

ListView lv = getListView();
lv.setOnItemClickListener(newsSelectListener);
于 2012-06-01T02:43:01.383 回答
1

我不确定您的代码是否有效

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();

    }
};

但在我看来,我经常在类中的方法中添加setOnClickListener()convertViewgetViewAdapter

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
                }
            }
        });
于 2012-05-31T22:12:50.430 回答
1

我看不到您在哪里初始化了布局...所以:

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

onCreate(Bundle)方法初始化您的Activity. 这是您通常setContentView(int)使用 xml 布局(main.xml或定义 UI 的 xml)调用的地方。放在后面super.onCreate(..)


关于这个例外:

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

检查你AndroidManifest.xml的是否Activity已经在那里:

<activity android:name=".<ActivityName>" 
          android:label="@string/app_name">
</activity>

如果您的问题尚未解决,请使用您的方法Logcat并使用Log.d您的方法来查看它在哪里崩溃。

于 2012-06-01T02:21:16.213 回答
0

编辑

好的 - 你在哪里设置setContentView(...)?这lv

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

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


可能的原因是:您正在OnClickListener设置nullin AlertDialog.BuildersetNeutralButton("OK", null)

因此,当您单击“确定”时,Android 会(在内部)调用如下内容:

neutralButtonListener.onClick(...);

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

于 2012-05-31T22:11:03.970 回答