2010-04-01 68 views
2

我希望在這裏解決的問題是,當我點擊ListView中的一個項目,該項目的背景變爲淺灰色,但當我繼續在列表中滾動瀏覽列表時,每個第4項都將背景更改爲淺灰色,即使其他項目未被點擊。我怎樣才能讓我點擊的物品受到點擊的影響?ListView選擇問題...使用onItemClick(AdapterView <?>父,查看視圖,...)

ListView lv = (ListView) findViewById(R.id.resultsList); 
    lv.setAdapter(new ArrayAdapter<String>(this, R.layout.resultitem, (String[])labelList.toArray(new String[labelList.size()]))); 

    lv.setOnItemClickListener(new OnItemClickListener() {  

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
      TextView tv = (TextView)view.findViewById(R.id.result); 
      tv.setBackgroundColor(Color.LTGRAY); 
      tv.setTextColor(Color.BLACK); 
     } 
    } 

回答

1

你必須重寫getView()在ListAdapter的子類,在這種情況下,ArrayAdapter。

這是因爲Android實際上重複使用行來節省資源和CPU(當一行從屏幕上滾動時,它被重新用於新行進入視圖)。因此,如果您將背景灰色設置爲一行,則可能會最終再次使用,並且背景仍然是灰色的。

如果你是ArrayAdapter的子類,你可以讓你的onItemClickListener設置某種標誌,然後你的ArrayAdapter的getView(),你可以根據該標誌設置合適的背景顏色。

This link

+0

感謝您的幫助! – searchMaker 2010-04-01 06:29:55

+0

這裏有什麼問題嗎? private class LabelAdapter extends ArrayAdapter { \t private String [] items; \t public LabelAdapter(上下文環境,int textViewResourceId,String []字符串){ \t super(context,textViewResourceId,strings); \t this.items = strings; \t} \t \t @Override \t公共視圖getView(INT位置,查看convertView,父的ViewGroup){ \t視圖v = convertView; \t TextView tt =(TextView)v.findViewById(R.id.result); \t tt.setText(items [position]); \t return v; \t} \t} – searchMaker 2010-04-01 07:28:26

+0

所以真的沒有簡單的方法來阻止適配器重新使用視圖? – searchMaker 2010-04-01 08:33:48

0

我假設你正在使用轉換視圖就這樣

...public View getView(int position, View convertView, ViewGroup parent) { .... 

子類ArrayAdapter的例子,你是改變其在第4位的背景,你的觀點讓我們說有6行在一個頁面上,因此每個頁面的每一行都會變灰,因爲重複使用了相同的convertView。

我不知道我解釋正確,但如果您使用convertview並更改其佈局,那麼您應該有邏輯重新創建該佈局以避免重新使用相同(緩存)的視圖。