ListView onclick影响多行

时间:2016-01-26 14:43:22

标签: android listview

我在按钮上设置的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关系?

1 个答案:

答案 0 :(得分:4)

问题不在于OnClickListener

您正在使用ViewHolder模式,这会导致ListView重新使用旧视图(不再可见)。 因此,如果更改属性(backgroundcolor和textcolor),这些属性在重新使用时将保持不变。

解决这个问题;跟踪点击的项目并重置getView

开头的属性