我尝试以这种方式实现一个有效的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>
在listViewAdapter中,我有:
if (myItems.get(position).getIsRed())
holder.background.setBackgroundResource(R.drawable.background_red);
其中:
ArrayList<myItem> myItems = ...
我的问题:
逻辑上,以这种方式,项目显示背景为“@ drawable / background_no_pressed”,并按下一个项目,此项目中的背景更改为“@ drawable / background_pressed”(列表中的其余项目保持“无按下”背景)。红色背景显示在myItems(position).getIsRed()==true
中,但在逻辑上滚动列表时,其他项目显示为红色背景(因为它们保留了视图持有者)。
所以我必须添加条件:
if (myItems.get(position).getIsRed()){
holder.background.setBackgroundResource(R.drawable.background_red);
}else{
holder.background.setBackgroundResource(R.drawable.selector);
}
但是添加这个,行为会发生变化,因为现在,当我点击一个项目时,此项目的背景更改为“@ drawable / background_pressed”,但其余(除了带有getIsRed的项目( )== true)也显示“按下背景”,好像所有这些都被按下一样(虽然Log表示只按下了项目,但这只是一个查看问题)。
我可以解决这个问题,通过更改listViewAdapter删除条件if(itemView == null),并为每个项目设置一个新的持有者,而不是每个视图一个持有者,但我认为这样做效率不高。
我该怎么办?感谢。