2011-03-09 83 views
11

我有一個簡單的ListView,我希望每個項目在用戶觸摸時突出顯示。我認爲這應該發生在默認情況下,但事實並非如此。你能建議嗎?如何突出顯示ListView項目的觸摸?

的ListView XML:

<ListView 
    android:id="@+id/list_view"  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:divider="#206600" 
    android:dividerHeight="2dp" 
    android:smoothScrollbar="true" 
    android:background="#ffffff" 
    > 
</ListView> 

我的適配器代碼:

private class MyAdapter extends ArrayAdapter<Task> { 
     private LayoutInflater mInflater; 

     public MyAdapter(Context context, int resource, List<Task> list) { 
      super(context, resource, list); 
      mInflater = LayoutInflater.from(context); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 

      if (v == null) { 
       v = mInflater.inflate(R.layout.list_item, null); 
      } 

      Task task = taskList.get(position); 

      /* Setup views from your layout using data in Object here */ 

      return v; 
     } 

回答

23

您可能希望發佈實際的行佈局代碼,但我懷疑問題在於您在列表行上設置了背景顏色。默認情況下,選擇器在列表項後面繪製(看起來更好,因爲高亮顏色在文本後面)。不要在列表項上設置背景顏色,或者將其設置爲在頂部繪製選擇器,而不是使用ListView的drawSelectorOnTop XML屬性。

編輯:如果你真的必須爲默認狀態不透明背景,並且不希望使用drawSelectorOnTop,你也可以試試這個:設置列表行的背景,但使用StateListDrawable使用@android:drawable/list_selector_background所有但默認狀態(您可以在繪圖文件夾中爲此定義一個xml文件;請參閱StateList documentation)。

您還可以在背景設置爲@android:drawable/list_selector_background的背景外部行佈局中嵌套佈局;這樣背景會在您的背景之上繪製,但在內容之下。

+0

另外,我誤解你的基本問題嗎?你是在談論按下的狀態,還是你想在觸摸和取消後保留選定的狀態(在這種情況下,RivieraKid的回答更相關)? – 2011-03-09 16:25:18

+0

刪除背景沒有做任何改變,所以我現在能夠看到選擇,謝謝。 – Eugene 2011-03-09 20:57:23

1

我相信這與在ListAdapter項目的 「已啓用」 屬性做。

如果您的適配器包含代碼:

@Override 
public boolean areAllItemsEnabled() { 
    return true; 
} 

,每個項目應該可以點擊(因此應該強調被觸摸)。

您可以發佈您用於此列表的什麼類型的適配器的詳細信息(也可能是代碼)嗎?

+0

不,這沒有幫助。我已經爲Adapter添加了代碼。 – Eugene 2011-03-09 15:52:30

+1

嗯,這是和姐姐的方法isEnabled(int位置)。如果您在getView()方法內添加一個調用,並使用調試器逐步調用它,則可以確定未啓用的項目是否是問題。 – Cephron 2011-03-09 16:13:29

2

ListView s在觸摸模式下不保留焦點(或選擇)的視覺指示。您只有在使用硬件鍵盤或控件導航UI時纔會看到此內容。

有關更多詳細信息,請參閱Google博客文章Touch Mode

因此,如果您只使用觸摸模式,您將永遠不會看到焦點或ListView s上的選擇。

0

我掙扎了幾天。最後,我必須創建一個支持Checkable接口的小部件,並在我的適配器的getiew()函數中返回該小部件/視圖。並且該列表視圖需要位於ListView.CHOICE_MODE_SINGLE(或可能由android:choiceMode指定的任何其他模式),以便跟蹤在UI上進行的選擇。

所以在本質上,所有需要完成以下任務到位爲ListView項目保留高亮:

  1. ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  2. ListAdapter.getView()返回實現Checkable接口
  3. ListView.OnItemClickListener應該叫setItemChecked(position, true)到一個視圖標記要檢查的項目(並因此在列表視圖中突出顯示)

希望這可以幫助那些也在爲此付出努力的人。