Android:每 9 次更改 1 个列表视图条目的颜色

Android: Change color of 1 listview entry applies on every 9th

我正在写一个 android 小应用程序。 我的列表视图有问题。 单击条目时,数据结构的状态应标记为已选中或未选中。在数据结构中一切都很好,但应该通过更改条目的背景颜色来可视化选择。 到目前为止一切顺利,但在单击正确的元素后会更改其颜色,而且 每 9 个 元素(单击条目 0 -> 更改颜色,还有条目 8、条目 16 等等)在列表视图中,但我不知道为什么。

问题:为什么不只是点击的条目改变了颜色?

这是我的 getView 代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View listItem = convertView;
    if (listItem == null)
        listItem = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);

    final User currentUser = userList.get(position);

    TextView username = listItem.findViewById(R.id.lv_username);
    String state = "disabled";
    if(currentUser.getSelected()) state = "enabled";
    username.setText(currentUser.getUsername() + " - " + state);
    listItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            currentUser.setSelected(!currentUser.getSelected());
            if (currentUser.getSelected()) {
                Log.d("onClick in Adapter", "selected");
                v.setBackgroundColor(Color.WHITE);
            }
            else {
                Log.d("onClick in Adapter", "not selected");
                v.setBackgroundColor(Color.TRANSPARENT);
            }
            notifyDataSetChanged();
        }
    });
    return listItem;
}

您尝试过吗,在 getview 中获取位置检查是否等于第 9,然后更改该行的背景颜色。

if (position==9){
            convertView.setTextColor(Color.RED);
}

这就是回收视图的工作方式,因为正在使用以前不可见的视图,所有状态都会保留,所以在重新使用时它已经被着色了(注意如果你点击它不会变透明,但点击两次会导致数据结构完好无损)。

解决方案是始终将状态重新应用到即将变为可见的视图。

if (listItem == null)
    listItem = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);
listItem.setBackgroundColor(currentUser.getSelected() ? Color.WHITE : Color.TRANSPARENT);