一个ListView行内观活动 [英] View Events inside a ListView Row
问题描述
我有一个使用自定义行布局的listactivity。布局包括2个标签,一个ImageView的和一个复选框。
Hey guys, I have a listactivity that uses a custom row layout. The layout consists of 2 labels, a imageview and a Checkbox.
我想,当复选框被选中火的监听器。监听我写的作品,但不是射击对个人行了,它会在listactivity每一行。就像如果我查一下我的第一行的复选框,对话框将打开并正常工作,但第二,第三和第四行也将火。
I'm trying to fire a listener when the Checkbox is checked. The listener I wrote works, but instead of firing for the individual row, it fires for every single row in the listactivity. Like if I check the checkbox in my first row, the dialog will open and work correctly, however the 2nd, 3rd and 4th rows will also "fire".
下面是我的code的适当区域:
Here's the appropriate area of my code:
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
final item o = items.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.name);
TextView bt = (TextView) v.findViewById(R.id.game);
CheckBox cb = (CheckBox) v.findViewById(R.id.caught);
if (cb != null && o.getStatus()) {
cb.setChecked(true);
} else {
cb.setChecked(false);
}
if (tt != null) {
tt.setText(o.getName());
}
if (bt != null && o.getStatus()) {
bt.setText("Game: " + o.getGame());
}
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
o.setStatus(isChecked);
if (isChecked) {
AlertDialog.Builder builder2 = new AlertDialog.Builder(
context);
builder2.setTitle("What game are we talkin gabout?");
builder2.setItems(Checklist.GAMES,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int item) {
Toast.makeText(context,
Checklist.GAMES[item],
Toast.LENGTH_SHORT).show();
o.setGame(Checklist.GAMES[item]);
o.setStatus(true);
me.notifyDataSetChanged();
}
});
builder2.show();
} else {
o.setGame("");
o.setStatus(false);
me.notifyDataSetChanged();
}
}
});
}
return v;
}
有没有更合适的地方建立我的复选框听众?
Is there a more appropriate place to create my listener for the checkbox?
推荐答案
我认为这不是一个好soloution每个视图与值更新时间assing新OnCheckedChangeListener。这将是最好只有一个时间设置一个监听器哪里在这个新的观点得到inflatet角度的视图。您可以通过将它变成CB的标签(setTag(..)),使其可用于监听邻对象。需要注意的是onCheckedChanged事件还激发当您通过cb.setChecked()设置CB的状态。
I think it's not a good soloution to assing a new OnCheckedChangeListener each time a view is updated with values. It would be better setting a listener only one time to a view at the point where this new view gets inflatet. You can make o-Object available for the listener by putting it into cb's tag (setTag(..)). Note that the onCheckedChanged event also fires when you set CB's state by cb.setChecked().
例如:
CheckBox cb = null;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
cb = (CheckBox) v.findViewById(R.id.caught);
// set a listener
cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
item o = (item) buttonView.getTag();
// show your dialog
}
});
}
item o = items.get(position);
if (o != null) {
TextView tt = (TextView) v.findViewById(R.id.name);
TextView bt = (TextView) v.findViewById(R.id.game);
cb = (CheckBox) v.findViewById(R.id.caught);
cb.setTag(o);
// set checked state & text
// ...
}
这篇关于一个ListView行内观活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!