ListView的setOnClickListener无法正常工作

时间:2010-08-04 02:50:03

标签: android listview

所以即时尝试为我的ListView设置一个setOnClickListener,但由于某些原因导致我的程序崩溃,当我尝试..我很新的编程所以当涉及到故障排除我真的不能做任何可悲的事情:(我的代码在下面,所以任何关于可能出错的想法都会非常有用

public class HomePageActivity extends Activity {
    //ListView that holds the items
    ListView lstTest;

    //Array Adapter that holds the ArrayList and displays the items on the ListView
    AlertsAdapter arrayAdapter;

    //List that hosts the items
    ArrayList<Alerts> alrts = null;

    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.homepage);

        //Initialize the ListView
        lstTest = (ListView)findViewById(R.id.lstText);

        //Initialize the ArrayList
        alrts = new ArrayList<Alerts>();

        //Initialize the array adapter
        arrayAdapter = new AlertsAdapter(HomePageActivity.this, R.layout.listitems,alrts);

        //Set the above adapter as the adapter of choice for our list
        lstTest.setAdapter(arrayAdapter);

        lstTest.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(
                HomePageActivity.this,
                PromotionActivity.class
                );
                startActivity(intent);
            }
        });

        //... ... ...

    }
} 

任何想法?我卡住了:(

编辑:从ddms发布错误日志文件

08-04 04:14:26.351: ERROR/AndroidRuntime(8882): FATAL EXCEPTION: main
08-04 04:14:26.351: ERROR/AndroidRuntime(8882): java.lang.RuntimeException: Unable to start activity ComponentInfo{hypenyte.bdutcher.promopost/hypenyte.bdutcher.promopost.HomePageActivity}: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.os.Looper.loop(Looper.java:123)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at java.lang.reflect.Method.invokeNative(Native Method)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at java.lang.reflect.Method.invoke(Method.java:521)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at dalvik.system.NativeStart.main(Native Method)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882): Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.widget.AdapterView.setOnClickListener(AdapterView.java:750)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at hypenyte.bdutcher.promopost.HomePageActivity.onCreate(HomePageActivity.java:58)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-04 04:14:26.351: ERROR/AndroidRuntime(8882):     ... 11 more

我看到它说我可能想要setOnItemClickListener,这本来就是我编码的,但是因为eclipse告诉我我的代码错了所以它不会工作

5 个答案:

答案 0 :(得分:50)

您需要使用setOnItemClickListener()

然后new android.widget.AdapterView.OnItemClickListener()

不是new View.OnItemClickListener()

答案 1 :(得分:5)

请尝试使用setOnClickListener

,而不是使用setOnItemClickListener

答案 2 :(得分:0)

如果使用Butterknife,请检查您是否没有适用于AdapterView下行的OnClick注释(Spinner,ListView等)

@OnClick(R.id.spinner_id)

调用ButterKnife.inject(this, view);将抛出异常

Caused by: java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead

答案 3 :(得分:0)

首先在您使用listview的主要活动中设置值:

new android.widget.AdapterView.OnItemClickListener()

代替listview的适配器:

  new AdapterView.OnItemClickListener() 

所以最后它看起来像:

this.listView.setItemsCanFocus(false);
this.listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(android.widget.AdapterView<?> parent, View view, int position, long id) {

 }

当您使用任何自定义视图填充listview中的数据时。

然后在父布局的主Activity file.xml中{listview is there},设置此选项:

    android:descendantFocusability="blocksDescendants"

如果您在listview中使用任何按钮/ textview,请在该textview /按钮上设置此属性:

    android:focusable="false"
    android:focusableInTouchMode="false"

对于列表视图中的滚动选项,只需在活动中添加以下内容:

 listView=(ListView)findViewById(R.id.container);
 listView.setNestedScrollingEnabled(true);

据我所知,我正在给予答案,我希望它会有所帮助,如果有人发现了一些更正或有帮助,我们欢迎他们。

答案 4 :(得分:0)

在我的情况下,我尝试为转盘添加onClickListener,但我遇到了同样的问题。我已经创建了使用触摸侦听器的解决方法。有时我们需要它用于hideKeyBoard或发送一些analyticEvent:

someSpinner.setOnTouchListener { _, event ->  onTouchSomeSpinner(event)}

fun onTouchSomeSpinner(event: MotionEvent): Boolean {
        if(event.action == MotionEvent.ACTION_UP) {
            view.hideKeyBoard()
            view.analyticsEvent()
            ...
        }
        return false
}