2010-02-11 71 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