我在按钮上设置的OnClickListener会影响ListView中的多行。我希望每个视图有一个监听器,每次点击一个响应。
GetView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ConditionChecklist conditionChecklist;
View view = convertView;
switch (getItemViewType(position)) {
case 0:
conditionChecklist = mConditionCheckListArray.get(position);
view = createDropdownRow(conditionChecklist, convertView, parent);
break;
case 1:
conditionChecklist = mConditionCheckListArray.get(position);
view = createButtonRow(conditionChecklist, convertView, parent);
break;
}
return view;
}
createButtonRow
public View createButtonRow(ConditionChecklist conditionChecklist, View convertView, ViewGroup parent) {
ButtonHolder buttonHolder;
if (convertView != null) {
buttonHolder = (ButtonHolder) convertView.getTag();
} else {
convertView = LayoutInflater.from(mContext).inflate(R.layout.condition_button_row, parent, false);
buttonHolder = new ButtonHolder();
buttonHolder.title = (TextView) convertView.findViewById(R.id.button_row_title);
buttonHolder.yes = (Button) convertView.findViewById(R.id.button_row_yes);
buttonHolder.no = (Button) convertView.findViewById(R.id.button_row_no);
buttonHolder.subQuestion = (AutoCompleteTextView) convertView.findViewById(R.id.button_row_autocomplete);
convertView.setTag(buttonHolder);
}
buttonHolder.title.setText(conditionChecklist.getQuestion());
setButtonRowListeners(buttonHolder);
setButtonRowAdapters(buttonHolder);
return convertView;
}
setButtonRowListeners
private void setButtonRowListeners(final ButtonHolder buttonHolder) {
buttonHolder.yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonHolder.yes.setBackgroundColor(mContext.getResources().getColor(R.color.colorAccent));
buttonHolder.yes.setTextColor(mContext.getResources().getColor(R.color.white));
buttonHolder.no.setBackgroundColor(mContext.getResources().getColor(R.color.lighterGray));
buttonHolder.no.setTextColor(mContext.getResources().getColor(R.color.mediumGray));
buttonHolder.subQuestion.setVisibility(View.VISIBLE);
}
});
buttonHolder.no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonHolder.no.setBackgroundColor(mContext.getResources().getColor(R.color.colorAccent));
buttonHolder.no.setTextColor(mContext.getResources().getColor(R.color.white));
buttonHolder.yes.setBackgroundColor(mContext.getResources().getColor(R.color.lighterGray));
buttonHolder.yes.setTextColor(mContext.getResources().getColor(R.color.mediumGray));
buttonHolder.subQuestion.setVisibility(View.GONE);
}
});
}
当我点击任何是或否按钮时,它会影响屏幕上的行中的按钮,这样当我向下滚动时,它们已经突出显示。我是否在某处打破了视图持有者模式?我的听众是不是像我认为的那样处于1-1关系?
答案 0 :(得分:4)
问题不在于OnClickListener
。
您正在使用ViewHolder模式,这会导致ListView
重新使用旧视图(不再可见)。
因此,如果更改属性(backgroundcolor和textcolor),这些属性在重新使用时将保持不变。
解决这个问题;跟踪点击的项目并重置getView