3

我有一個簡單的Strings數組,我用ArrayAdapter以橫向ListView顯示。 我想要做的是:當用戶從ListView中選擇一個項目時,使該項目不可點擊並更改該項目的背景顏色。也許就像一個「灰色」的外觀。我正在考慮創建一個自定義Adapter並覆蓋isEnabled(int position)方法,但我不知道如何去做這件事。任何意見,建議,或幫助將不勝感激謝謝!如何在點擊後禁用ListView項目?

+2

自定義列表適配器的聲音正是你需要的 – brendosthoughts 2013-04-08 18:10:09

回答

9

我一直在尋找到創建自定義適配器和重寫isEnabled(int position)方法,但我不知道我怎麼會去了解這一點。

這很容易做到。我建議SparseBooleanArray以跟蹤效率啓用的項目:

public class MyAdapter extends ArrayAdapter<String> { 
    private SparseBooleanArray enabledItems = new SparseBooleanArray(); 

    public MyAdapter(Context context, int textViewResourceId, List<String> objects) { 
     super(context, textViewResourceId, objects); 
    } 

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

    @Override 
    public boolean isEnabled(int position) { 
     return enabledItems.get(position, true); 
    } 

    public void toggleItem(int position) { 
     boolean state = enabledItems.get(position, true); 
     enabledItems.put(position, !state); 
    } 
} 

的Eclipse的自動完成功能都必須工作,但這裏有一些快速提示:

  • 必須覆蓋areAllItemsEnabled()isEnabled()沿
  • 我設計toggle()由一個onItemClickListener()使用。如果你願意,你只需要調用adapter.toggle(position)
  • 改變行的外觀(比默認情況下啓用和禁用更多)簡單地覆蓋getView()。不要忘了覆蓋這兩種情況:

    public View getView(int position, View convertView, ViewGroup parent) { 
        convertView = super.getView(position, convertView, parent); 
    
        if(!isEnabled(position)) { 
         /* change to disabled appearance */ 
        } 
        else { 
         /* restore default appearance */ 
        } 
        return convertView; 
    } 
    

    希望幫助!

0

使用setEnabled(bool)屬性:

yourlistview.setEnabled(false); 
+0

這是否會禁止整個ListView的?因爲我只需要它在ListView中禁用單擊的項目。 – chRyNaN 2013-04-08 18:21:31

+0

@AndroidStudent Yup ... – NullPointer 2013-04-08 18:24:21

2

通位置適配器類,當你在列表項點擊的setSelectedIndex的

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     adapter.setSelectedIndex(position); 
    } 

add方法適配器類

public void setSelectedIndex(int ind) 
    { 
     selectedIndex = ind; 
     notifyDataSetChanged(); 
    } 

現在檢查這個列表視圖,如果相同的現在的位置,然後啓用並在getView me中禁用值方法

if(selectedIndex!= -1 && position == selectedIndex) 
     { 
      holder.tv.setBackgroundColor(Color.BLACK); 
     } 
     else 
     { 
      holder.tv.setBackgroundColor(selectedColor); 
     } 
     holder.tv.setText("" + (position + 1) + " " + testList.get(position).getTestText()); 

Reference from here

+0

及以上sam 回答也不錯 – QuokMoon 2013-04-08 18:25:33

0

不知道它是否會工作或沒有

public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
       // your code 
       view.setBackgroundColor(Color.BLUE); 
       view.setEnabled(false); 
    } 
+0

如果每行都是一個單獨的View,但ListViews會循環使用以提高效率,所以這不會像您期望的那樣運行。 – Sam 2013-04-08 18:29:15