ListView,单击一个项目,选中所有项目

时间:2014-11-13 12:56:14

标签: 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);
  ...          
  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),并为每个项目设置一个新的持有者,而不是每个视图一个持有者,但我认为这样做效率不高。

我该怎么办?感谢。

0 个答案:

没有答案