安卓 ViewHolder : Update only the view clicked

标签 android listview

获取 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/

相关文章:

android - 移动端真实用户监控

java - Android:如何将回调传递给 Activity ?

java - 在 Android 中实现自定义 ListView

android - 列表项从 ListView 中删除,但不从数据库中删除

java - 使用 ArrayAdapter 通过自定义适配器将动态图像添加到 ListView

Android在ListView中实现聊天气泡

android - 设置 Android 对话框 Activity 位置

java - 为什么 Observable.zip 不调用finallyDo?

wpf - ListView 中的中心单列包含图像

android - 在 google play 商店中显示应用视频