编辑:找一个 “开箱即用” 的帖子的末尾例子!
因为你看到多行受到影响我猜它有些事情要做系统如何回收资源,也许对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或其他未经检查的通话可能会在运行时抛出一个错误!