我有一个自定义ListAdapter
,其元素由一个TextView
和CheckBox
组成。问题是复选框没有收到任何点击事件。
下面的适配器代码。
public DragNDropAdapter(Context context) {
mViews = new View[mTexts.length];
for (int i = 0; i < mViews.length; i++) {
LinearLayout layout = new LinearLayout(context);
TextView textView = new TextView(context);
textView.setText(mTexts[i]);
layout.addView(textView);
CheckBox checkBoxView = new CheckBox(context);
checkBoxView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
log("clicked"); //doesn't work
}
});
layout.addView(checkBoxView);
mViews[i] = layout;
}
}
public View getView(final int position, View convertView,
ViewGroup parent) {
return mViews[position];
}
点击chechboxes时没有任何反应。但是当我转动屏幕并且所有内容都“自动重新创建”时,所有丢失的日志都会一起显示。
问题是,为什么以及为什么拒绝这些点击事件?
以前我喜欢它:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LinearLayout layout = new LinearLayout(context);
TextView textView = new TextView(context);
textView.setText(mTexts[position]);
layout.addView(textView);
CheckBox checkBoxView = new CheckBox(context);
checkBoxView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
log("clicked");//do work
}
});
layout.addView(checkBoxView);
convertView = layout;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//(...) setting holder's info
return convertView;
}
点击事件已正确传递。有什么不同?我不能使用第二种方法,因为它是一个拖放适配器,我无法找到跟踪复选框状态的好方法。
总结一下 - 为什么点击事件在第一种方法中不起作用,但在第二种方法中起作用?
答案 0 :(得分:0)
使用
CheckBox checkBoxView = new CheckBox(context);
而不是
CheckBox checkBoxView = new CheckBox(mContext);
人们已经说过 - 使用OnCheckedChangedListener
答案 1 :(得分:0)
以下是我的做法(假设您从持有人那里获得了正确的复选框):
holder.(checkboxNameInTheHolder).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Your stuff
}
});
希望有所帮助。 问候。
答案 2 :(得分:0)
更改
CheckBox checkBoxView = new CheckBox(context);
checkBoxView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
log("clicked");//do work
}
});
layout.addView(checkBoxView);
要
CheckBox checkBoxView = new CheckBox(context);
layout.addView(checkBoxView);
checkBoxView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
log("clicked");//do work
}
});
OR(推荐):
checkBoxView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
if(isChecked)
log("clicked");//do work
}