2010-02-11 93 views
2

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

但我的OnItemClickListener不会被调用!我发现this very similar question,但解决方案(禁止列表项视图获得焦点)不适用于我。但是,长时间点击会被捕获 - 我的OnItemLongClickListener被调用。请看下面的代码并自己尝试。这是我的代码的简化版本,显示了错误行为。顺便说一句:我在Eclipse 3.5.1上使用Andriod SDK 2.0。

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"没有影响。

谢谢!
扎赫尔

回答

1

将您检索的ListView

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

完美,工作!谢谢!但为什么?在添加侦听器之前调用'setContentView()'时会发生什么变化? – craesh 2010-02-11 10:37:41

+0

TBH,我不知道。我猜这些事件与活动有关,而不是视图本身(这只是一种猜测) - 如果你认为这是正确的,请接受答案 – ccheneson 2010-02-11 10:44:15

+0

显然上面的评论是不正确的 - 从http://developer.android .com/intl/de/guide/topics/ui/ui-events.html“,一个事件监听器是View类中的一个接口,它包含一个单一的回调方法,这些方法将在Android框架用户与用户界面中的项目交互触发了监听器已注册的内容。“ - 仍然试图找到一些答案 – ccheneson 2010-02-11 10:48:03

2

当您添加与布局后的setContentView权setContentView(lv);,内视图布局得到新鲜实例化。即使您没有添加自己的布局,ListActivity的布局默认情况下也很简单(阅读它的here)。因此,在您第一个例子基本上是:

  • 首先,你的监听器添加到默认的ListView的ListActivity内
  • 然后你把那个ListView的路程使用的setContentView用新的ListView来实例化一个新的布局
  • 然后你从来没有注册一个新的侦听器到新的布局中的新的ListView。

而当您在代码中将setContentView拉起来时,您只能使用自己的ListView,并且所有事情都按预期工作。

+0

有趣的 - 我不明白的是,如果setContentView创建新实例(在第一个示例中), ListView如何显示列表项?它不应该是一个空的列表? – ccheneson 2010-02-11 12:29:46

+0

从文档“ListActivity托管一个可以绑定到不同数据源的ListView对象”。由于setAdapter被调用(this),所以当它实例化时,我想这就是为什么items被保存。 – ccheneson 2010-02-11 12:35:10

+0

感谢您的解释!这是一个通用规则吗?我是否必须首先通过'setContentView()'实例化我的视图,然后设置所有监听器和其他设置?我在官方文档中找不到任何关于此的信息。你知道更多的资源吗?还有其他的陷阱吗? – craesh 2010-02-13 16:49:19