2011-11-24 116 views
0

好吧,所以我知道這個問題已經在本網站上提出過,但坦率地說,我沒有從我見過的解決方案中得到任何結果。例如,這篇文章:highlighting the selected item in the listview in android建議你所需要做的就是設置一個choiceMode到ListView。我試過這個,它根本不起作用。在ListView中突出顯示項目

在我的代碼中,我有一個ListView(onListItemClick)的監聽器,每次觸發時,我都有這樣的... getListView().setItemChecked(position, true),最重要的是我有一個XML選擇器,我已附加到我的ListView ...

<ListView      
    android:id="@id/android:list" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:scrollbars="none" 
    android:layout_weight="1.5" 
    android:choiceMode="singleChoice" 
    android:listSelector="@drawable/bounty_list_selector"/> 

我在這裏錯過了什麼嗎? setItemChecked()對ListView的選擇器沒有影響嗎?

+0

你只是想讓選擇器圖形顯示在點擊行上? (它不會如果行內的東西有自己的onClickListener) – FunkTheMonk

+1

我認爲android:listSelector的想法是處理列表選擇(使用dpad在列表中移動),它不會影響已檢查的行。 – aromero

+0

@FunkTheMonk,即時通訊試圖讓列表中的項目「突出顯示」或基本上改變點擊後的背景顏色,但我只需要一次「檢查」一個項目。 –

回答

0

我有類似的問題,並通過代碼解決它。它可能不是最聰明也不是最有效的解決方案,但是可以解決ListView繪圖問題,並且迄今爲止似乎運行良好。

活動文件:

private ListView listView; 
private View selectedView; 
private int selectedPosition; 
private MyAdapter arrayAdapter; 

... 
// set a state machine for when a list item is clicked 
    listView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if (selectedPosition == -1) { 
       // no item is selected, mark as selected 
       selectedView = view; 
       view.setBackgroundResource(R.drawable.bg_selected); 
       selectedPosition = position; 
      } else if (selectedPosition == position) { 
       // the same item is selected as the previous one, deselect 
       selectedView = null; 
       view.setBackgroundResource(R.drawable.bg_unselected); 
       selectedPosition = -1; 
      } else { 
       // another item is selected, deselect the previous and select the new one 
       selectedView.setBackgroundResource(R.drawable.bg_unselected); 
       selectedView = view; 
       view.setBackgroundResource(R.drawable.bg_selected); 
       selectedPosition = position; 
      } 

      arrayAdapter.setSelectedPosition(selectedPosition); 
     } 
    }); 

適配器代碼:

public class MyAdapter extends ArrayAdapter<MyObject> { 
    private int selectedPosition; 

    private static class ViewHolder { 
     RelativeLayout layout; 
     ... 
    } 

    public void setSelectedPosition(int selectedPosition) { 
     this.selectedPosition = selectedPosition; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_row, null); 
      holder = new ViewHolder(); 
      holder.layout = (RelativeLayout) convertView.findViewById(R.id.rl_item); 
      ... 

      convertView.setTag(holder); 
     } 
     else 
      holder = (ViewHolder) convertView.getTag(); 

     ... 
     if (position == selectedPosition) 
      holder.layout.setBackgroundResource(R.drawable.bg_selected); 
     else 
      holder.layout.setBackgroundResource(R.drawable.bg_unselected); 
     ... 

     return convertView; 
    } 

    ... 
} 

希望它能幫助!