Android ListView,单击一个项目,选择所有项目

Android ListView,单击一个项目,选择所有项目,android,user-interface,android-listview,Android,User Interface,Android Listview,我尝试通过以下方式实现一个高效的listViewAdapter: if (itemView == null) { itemView = mInflater.inflate(R.layout.item, null); holder = new ViewHolder(); ... holder.background = (RelativeLayout)itemView.findViewById(R.id.item_background); ... i

我尝试通过以下方式实现一个高效的listViewAdapter:

if (itemView == null) {  

  itemView = mInflater.inflate(R.layout.item, null);
  holder = new ViewHolder();
  ...
  holder.background = (RelativeLayout)itemView.findViewById(R.id.item_background);
  ...          
  itemView.setTag(holder);

}else{ 

  holder = (ViewHolder) itemView.getTag();

}
listView中的项目类似于:

public class MyItem {
    ...
    boolean isRed;
    ...
}
我有一个类似于这样的背景选择器(该选择器在android:background中设置,在XML R.layout.item中),名为selector.XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <item android:state_pressed="false" android:drawable="@drawable/background_pressed" />

  <item android:drawable="@drawable/background_no_pressed" />

</selector>
其中:

ArrayList<myItem> myItems = ...
但是加上这一点,行为会发生变化,因为现在,当我单击一个项目时,该项目将其背景更改为“@drawable/background\u pressed”,但其余的(getIsRed()==true的项目除外)也显示为“pressed background”,就好像所有项目都被按下一样(虽然日志表明只有项目被按下,但这只是查看问题)

我可以通过更改listViewAdapter来解决这个问题,方法是删除条件if(itemView==null),并为每个项设置一个新的holder,而不是为每个视图设置一个holder,但我认为这是没有效率的


我能做什么?谢谢。

当然,因为将字段isRed设置为true,然后将其传递到下一个视图,它将再次为true,所以每次调用getView时都必须检查该字段。对不起,我认为我的解释不正确。我编辑了我的解释。您将if(isRed())放在哪里了在你的适配器中???在if/else或where中??我只能推荐调试
getView()
方法,你显然在某个地方弄错了。你还应该发布
getView()
的完整代码你能上传视频吗?我想我知道了,但我不确定。
ArrayList<myItem> myItems = ...
if (myItems.get(position).getIsRed()){
      holder.background.setBackgroundResource(R.drawable.background_red);
}else{
      holder.background.setBackgroundResource(R.drawable.selector);
}