【问题标题】:ListView Images change back to original settings when scrolled out of view - Android滚动出视图时,ListView 图像更改回原始设置 - Android
【发布时间】:2013-11-27 11:22:42
【问题描述】:

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

【问题讨论】:

  • 您如何获得p?你能从一开始就发布getView()吗?

标签: android listview android-listview


【解决方案1】:

您需要保留已通过按下按钮修改的项目的状态,然后在为该项目调用适配器的 getView() 时恢复该状态。

您可以通过多种方式执行此操作:在内存、数据库等中。您必须选择最适合您的目的的方法。

即- 单击第 3 项,图像从灰色变为绿色,存储一些东西来表示图像的状态(灰色与绿色,布尔值非常适合这种情况),然后将该数据保存在某处。然后,当getView() 再次为第 3 项调用(即将再次显示)时,您根据为第 3 项保留的数据设置图像的颜色。

您可以只修改支持ListView 的原始JSONArray 中的值,顺便说一句。

【讨论】:

  • 感谢您的回答!我以前听过这个,你解释得比任何人都好。但是如何更改原始 JSONArray 的值?
  • err... 可能在那个问题上说得太快了。我不确定这是否可以......很容易。无论如何,我会将数据从JSONArray 移出并移到ArrayList 或其他东西中,然后您可以非常轻松地修改ArrayList 的元素。你的JSONArray 里有什么?
【解决方案2】:

这种行为的原因是因为您没有保留项目的状态(无论它们是否被点击)。每次滚动列表时,都会调用 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
});

注意:这只是获得您想要的东西的众多方法之一,但基本思想应该是相同的..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多