Android ListView不会单击单击

时间:2010-02-11 09:49:45

标签: android listview

我正在Android上开发一个简单的应用程序,其中一些项目显示在列表中。用户可以点击一个,带他进一步活动。基础...

但是我的OnItemClickListener没有被调用!我找到了this very similar question,但解决方案(禁止列表项视图获得焦点)对我不起作用。然而,长时间点击会被捕获 - 我的OnItemLongClickListener被调用。请查看以下代码并亲自试用。这是我的代码的简化版本,显示了错误的行为。顺便说一下:我正在使用Andriod SDK 2.0和Eclipse 3.5.1。

package de.sacherkhoudari.listtest;

import java.util.LinkedList;
import java.util.List;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;

public class ListTest extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final List<ListEntry> lEntries = new LinkedList<ListEntry>();
        for ( int ii = 0; ii < 10; ii++ )
            lEntries.add( new ListEntry( "Entry " + ii ) );

        setListAdapter( new ArrayAdapter<ListEntry>( this, R.layout.list_item, lEntries ) );

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener( new OnItemClickListener() {
            public void onItemClick( AdapterView<?> parent, View view, int position, long id ) {
                Toast.makeText( ListTest.this, "ItemClick at item " + lEntries.get(position).toString(), Toast.LENGTH_LONG ).show();
            }
        });

        lv.setOnItemLongClickListener( new OnItemLongClickListener() {
            public boolean onItemLongClick( AdapterView<?> parent, View view, int position, long id ) {
                Toast.makeText( ListTest.this, "ItemLongClick at item " + lEntries.get(position).toString(), Toast.LENGTH_LONG ).show();
                return false;
            }
        });

        setContentView(lv);
    }
}

class ListEntry {
    private String name;

    public ListEntry( String s ) {
        name = s;
    }

    public String toString() {
        return name;
    }
}

到目前为止,Java代码......布局list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textSize="16sp"
    android:focusable="false" >
</TextView>

注意:android:focusable="false"无效。

谢谢!
扎赫尔

2 个答案:

答案 0 :(得分:2)

当您使用setContentView添加布局时,该布局中的视图将获得新的实例化。 ListActivity默认情况下具有非常简单的布局(阅读它here),即使您没有添加自己的布局。所以基本上在你的第一个例子中:

  • 首先,您将一个侦听器添加到ListActivity中的默认ListView
  • 然后使用setContentView将ListView抛出,以使用新的ListView实现新布局
  • 然后,您永远不会从新布局中向新ListView注册新的侦听器。

当您在代码中提取setContentView时,您只能使用自己的ListView,并且一切都按预期工作。

答案 1 :(得分:1)

检索ListView后立即移动setContentView(lv);

ListView lv = getListView();
setContentView(lv);
lv.setTextFilterEnabled(true);