获取 View
@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;
}
创建按钮行
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);
}
});
}
当我点击任何是或否按钮时,它会突出显示屏幕外的按钮。因此,当我向下滚动时,下方行中的按钮已经突出显示。我知道这是因为 ViewHolder 正在回收我的观点。我如何确保只有我点击的 View 会突出显示?
最佳答案
就像您自己说的: View 得到回收。
因此,当使用 createButtonRow()
获取"new"行时,您需要通过单击按钮来更新要更改的 View 的状态。
此外,您似乎正在使用 buttonHolder
来存储状态。根本不应该这样做。您需要将状态存储在其他地方,因为每次回收 View 时都会丢失状态。
关于安卓 ViewHolder : Update only the view clicked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35024881/