我有一个包含多个ListView项的ListView。 ListView项布局包含ImageView。我使用这个ImageView作为按钮。单击该按钮时,它会将ImageView从灰色图像更改为绿色图像。但是当我从可见视图中滚动ImageView然后返回到它时,它将返回其原始颜色。创建ImageView时,它可以是绿色或灰色,它取决于JSON数组。因此,如果图像为绿色并单击,则会变为灰色。然后,当它离开可见视图并返回到可见视图时,它再次变为绿色!如何让图像保持新状态?
这是我的代码,
if(p.getJSON().equals("NO")){
imageView.setBackgroundResource(R.drawable.gray);
imageView.setTag(0);
}//end if equals NO
if(p.getJSON().equals("YES")){
imageView.setClickable(false);
imageView.setBackgroundResource(R.drawable.green);
imageView.setTag(1);
}//end if equals yes
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View imageView) {
final int status = (Integer) imageView.getTag();
if (status == 0){
imageView.setBackgroundResource(R.drawable.green);
imageView.setTag(1);
}
else{
imageView.setBackgroundResource(R.drawable.gray);
imageView.setTag(0);
}
}//end on click
});
答案 0 :(得分:0)
您需要通过按下按钮保持已修改的项目的状态,然后在为该项目调用适配器的getView()
时恢复该状态。
您可以通过多种方式执行此操作:内存,数据库等。您必须选择最适合您的方法。
即。 - 项目3被点击,图像从灰色变为绿色,存储一些东西来表示图像的状态(灰色与绿色,布尔值对于这个确切的情况很好),然后将数据保存在某处。然后,当再次调用项目3的getView()
(它将要再次显示)时,您可以根据项目3持久保存的数据设置图像的颜色。
您可以修改支持JSONArray
的原始ListView
中的值,顺便说一句。
答案 1 :(得分:0)
出现这种行为的原因是因为您没有保留项目的状态(如果它们被点击了或没有)。每次滚动列表时,都会调用getView()
并执行以下代码并重置状态:
if(p.getJSON().equals("NO") ){
imageView.setBackgroundResource(R.drawable.gray);
imageView.setTag(0);
}//end if equals NO
if(p.getJSON().equals("YES")){
imageView.setClickable(false);
imageView.setBackgroundResource(R.drawable.green);
imageView.setTag(1);
}//end if equals yes
需要的是根据每个项目的位置跟踪每个项目状态的方法。所以你可以自信地说出:位置k
的项目是"YES"
或"NO"
!
您需要跟踪已单击的项目,以便在调用getView()时,可以根据其当前值更新基于状态(不基于JSON值)。
1)维护一个已检查的项目位置图,以及相应的状态值("YES"
或"NO"
)。
2)如果单击了项目,则将其(位置,新状态)添加到地图中。如果再次单击它,请在地图内更新其状态。
3)使用此地图并在getView()
中设置项目的状态,例如:
私人领域:
HashMap<Integer, String> map = new HashMap<Integer, String>();
在getView()
:
String state = p.getJSON();
if(map.containsKey(position)) {
state = map.get(position);
}
if(state.equals("NO") ){
imageView.setBackgroundResource(R.drawable.gray);
imageView.setTag(0);
}//end if equals NO
if(state.equals("YES")){
imageView.setClickable(false);
imageView.setBackgroundResource(R.drawable.green);
imageView.setTag(1);
}//end if equals yes
final int pos = position;
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View imageView) {
final int status = (Integer) imageView.getTag();
if (status == 0){
imageView.setBackgroundResource(R.drawable.green);
imageView.setTag(1);
map.put(pos, "YES")
}
else {
imageView.setBackgroundResource(R.drawable.gray);
imageView.setTag(0);
map.put(pos, "NO")
}
}//end on click
});
注意:这只是获得所需内容的众多方法之一,但基本理念应该相同..