滚动视图时,ListView图像会更改回原始设置 - Android

时间:2013-11-27 02:46:36

标签: android listview android-listview

我有一个包含多个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
        });

2 个答案:

答案 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
});

注意:这只是获得所需内容的众多方法之一,但基本理念应该相同..