我正在写一个小的android应用程序。 我有一个listview的问题。 单击条目时,应将数据结构的状态标记为已选择或未选中。在数据结构中,一切都很好,但应通过更改条目的背景颜色来显示选择。 到目前为止一切都那么好,但是点击后正确的元素改变了它的颜色,但是每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;
}
答案 0 :(得分:2)
这就是回收视图的工作方式,因为之前使用的是不可见的视图,所有状态都会被保留,所以当重新使用时它会被着色(请注意,如果单击它将不会变为透明,但点击两次将会因为数据结构完好无损)。
解决方案是始终将状态重新应用于即将变为可见的视图。
if (listItem == null)
listItem = LayoutInflater.from(mContext).inflate(R.layout.listitem, parent, false);
listItem.setBackgroundColor(currentUser.getSelected() ? Color.WHITE : Color.TRANSPARENT);
答案 1 :(得分:0)
你试过吗,在getview中获取位置检查是否等于9,然后改变该行的背景颜色。
if (position==9){
convertView.setTextColor(Color.RED);
}