編輯:找一個 “開箱即用” 的帖子的末尾例子!
因為你看到多行受到影響我猜它有些事情要做系統如何回收資源,也許對Button的引用是不明確的。
我不確定我在哪里選擇了這種做法(Android教程或我們以前的開發人員通過這些教程學習了Android)。然而,建議是使用一個嵌套類ViewHolder
private static class ViewHolder {
public Button processCheck;
}
將此放在適配器或任何類的getView()在聲明并修改它是這樣:
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
$ViewHolder viewHolder; //wait for the magic!
if (v == null) {
v = li.inflate(R.layout.process_row, null);
$viewHolder = new ViewHolder();
$viewHolder.processCheck = (Button) v.findViewById(R.id.processCheck);
$v.setTag(viewHolder);
//ok we somewhat stuffed an object with the Button into our View... so what?
}
$viewHolder = (ViewHolder) v.getTag();
//see explanation below
$viewHolder.processCheck.setOnClickListener(new View.OnClickListener() {
//set the onClickListener for this and only this button.
@Override
public void onClick(View v) {
if (process.isChecked() == false) {
process.setChecked(true);
processCheck.setBackgroundColor(Color.BLUE);
}
else {
process.setChecked(false);
processCheck.setBackgroundColor(Color.RED);
}
}
});
return v;
}
(我打上$變化。我認為這樣他們應該很容易發現,如果我使用eclipse。否則查找+替換^^)
因此??將返回一個與調用的視圖關聯的對象。對象是如此令人難以置信的泛型,您可以將其稱為您創建的ViewHolder對象。因此,您可以引用按鈕并將其存儲在對象中。
現在,無論何時獲得ListView,都可以檢索對象并設置新鮮和新鮮的OnclickListener。這樣你只有一個Listener被調用。
請注意,您不必再次致電v.setTag();來“保存”您的更改。
一個陷阱可能是如果你瘋狂的東西,像在同一個列表中膨脹不同的布局,有什么理由。你也許會不同ViewHandlers分配給他們,如:
if (v == null) {
if(someCriteria) {
v = li.inflate(R.layout.process_row, null);
viewHolder = new ViewHolder();
}
v = li.inflate(R.layout.process_another_row, null);
viewHolder = new AnotherViewHolder();
}
隨后的getView()一個ViewHolder或其他未經檢查的通話可能會在運行時拋出一個錯誤!