2013-04-26 97 views
2

我正在使用自定義ListViewAdapter來顯示,以及一個列表。 列表中的每一行都有3個按鈕,即附加的監聽器。 但是我發現它非常令人不安,即在每次滾動時,都會創建新的OnClickListeners,即使對於convertView所在的那些行,也會創建一個非空值。ListViewAdapter - 收聽附加到視圖的偵聽器時收集?

//最常見的方法來轉換視圖,我的理解:

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.listview_item, parent, false); 
    } else { 
     view = convertView; 
    } 
    final TextView textView = (TextView) view.findViewById(R.id.txtProduct); 
    textView.setText(name); 
    textView.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      ... 
     } 
}); 
... two more listeners, with the same approach 
return view; 

按我的與Java,蜘蛛感覺「叮 - lings」的體驗 - 似乎是創建和扔掉相同的監聽器方法是垃圾收集器濫用。 我不知道什麼時候收聽老聽衆,如果有...

有沒有辦法使用舊的偵聽器,而不是創建一個新的? (某種緩存數據結構)

回答

1

您可以將您的列表適配器類設置爲從View.OnClickListener接口繼承。然後,簡單設置

textView.setOnClickListener(this); 

並處理您的適配器類'onClick方法中的點擊。要知道,例如,點擊哪一行,加上之前上面的那個這一行:

textView.setTag(position); 

然後,在onClick,你可以知道你是通過獲取此標記處理列表中的哪個位置:

public void onClick(View v) { 
    Object item = myList.get((Integer) v.getTag()); 
    //handle click event 
} 
+0

因此,一行將成爲一個可點擊的偵聽器,convertView也會重用偵聽器。美麗和優雅的解決方案:) 但是,我正在尋找的是一行,有3個聽衆,他們每個人的行爲不同,所以onClick實施,不會解決問題。 – firluk 2013-04-27 08:47:09