Android ListView在以下情况下重用视图。。。我不知道';我不想这样

Android ListView在以下情况下重用视图。。。我不知道';我不想这样,android,Android,我有一个列表视图,每个项都包含一个切换按钮。在我切换它,然后向上或向下滚动之后,ListView正在循环视图,因此其他一些视图正在镜像切换按钮的选中状态。我不要这个。我如何防止它?Android会出于性能目的回收列表项。如果希望ListView平滑滚动,强烈建议重用它们 对于每个列表项,将调用适配器的getView函数。在这里,您必须为ListView要求的项分配值 看看这个例子: @Override public View getView(int position, View convertV

我有一个
列表视图
,每个
都包含一个
切换按钮
。在我切换它,然后向上或向下滚动之后,ListView正在循环视图,因此其他一些视图正在镜像
切换按钮的选中状态。我不要这个。我如何防止它?

Android会出于性能目的回收列表项。如果希望ListView平滑滚动,强烈建议重用它们

对于每个列表项,将调用适配器的
getView
函数。在这里,您必须为ListView要求的项分配值

看看这个例子:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = null;

    if ( convertView == null )
    {
        /* There is no view at this position, we create a new one. 
           In this case by inflating an xml layout */
        convertView = mInflater.inflate(R.layout.listview_item, null);  
        holder = new ViewHolder();
        holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
        convertView.setTag (holder);
    }
    else
    {
        /* We recycle a View that already exists */
        holder = (ViewHolder) convertView.getTag ();
    }

    // Once we have a reference to the View we are returning, we set its values.

    // Here is where you should set the ToggleButton value for this item!!!

    holder.toggleOk.setChecked( mToggles.get( position ) );

    return convertView;
}
请注意,
ViewHolder
是一个静态类,我们用来回收该视图。其属性是列表项所具有的视图。它在适配器中声明

static class ViewHolder{
    ToggleButton toggleOk;
}
mtogles
在适配器中声明为私有属性,并使用如下公共方法设置:

public void setToggleList( ArrayList<Boolean> list ){
        this.mToggles = list;
        notifyDataSetChanged();
    }
public void setToggleList(数组列表){
this.mtogles=列表;
notifyDataSetChanged();
}
有关更多信息,请查看其他自定义ListView示例


希望有帮助。

将这两种方法添加到适配器中

@Override

public int getViewTypeCount() {                 

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}

您可以使用
HashMap
保存按钮状态:

 private Map<Integer,Boolean> listMapBoolean = new HashMap<Integer,Boolean>();


 toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            listMapBoolean.put(position, true);
                        } else {
                            listMapBoolean.put(position, false);
                        }
                    }
                });

不确定这是否对你有帮助。在我的
列表视图中循环使用我的
编辑文本
时,我也遇到了一些问题,可能是您应该尝试使用滚动视图创建自己的列表视图,并创建一个容器,其中包含以编程方式添加到容器中的子项。设置用于标识子对象的标记,或者您可以使用子对象的顺序来设置

post-your-getview()方法存在问题,我知道所有这些。如果视图中的数据发生变化,我希望ListView不会重用视图。我不明白你的意思。我无法想象你为什么每次都需要一个新的视角。事实上,我认为视图的重用是Android的一个很好的特性。这一点很好理解,我并不反对重用视图的好处。但是,让每个项目的toggleButton保持其正确状态(选中或未选中)对我来说是否合理呢?如果您的ListView很长,不重用意味着浪费内存。在移动设备中,你必须小心这一点。此外,您应该在模型中而不是视图中保留项目的状态。无论如何,回答您的问题,如果您想为每个项目创建一个视图,只需在每次调用
getView
时创建它(忘记
if…else…
语句)。但是我不推荐。@LuxuryMode:你能把你是如何解决的吗?我也处于同样的地位。对于每个listview项,它的类中都有一个“DATE”,我每次都检查该日期是否已经不在arraylist中,然后将日期添加到该listview项中,并将其添加到arraylist中。现在,当再次调用getView时,由于日期已经在date arraylist中,它会从中删除日期,而现在,尽管我花了很多时间来处理它。。你能帮忙吗?这太可怕了@如果罗曼圭偶然发现这一点,他可能会流下血泪!您基本上是告诉适配器永远不要回收视图。这将导致用户界面迟钝,缺乏响应能力。各位,请不要用这个!为了你的用户!这样做相当于不使用数组列表,而只是使用ScrollView并调用
.addView
将所有行抛出其中。。。如果您的行中也有图像-OutOfMemory异常即将出现…这将禁用视图回收!!这正是我需要的!!在我的例子中,ListView只有5-7个单元格,但布局和内容完全不同。循环使用视图会造成巨大的混乱。。。非常感谢这次调整!!我不知道。。。我有一个列表,最多有60个youtube缩略图、标题、持续时间,可能还有下载PDF文件的链接。对于傻笑,为了测试这一点,我使用这种方法将100多个傻笑放在一个列表中。没有一个问题。卷轴非常平滑。我还没有在较旧的设备上测试过这一点,但这似乎是一个很好的解决方案。呃,请谨慎使用,仅限:仅当您知道100%列表很小,并且已知的用户界面在查看时使用低内存时才适用;当然,您首先需要将所有tooglebuttons设置为false。
 for (Entry<Integer, Boolean> entry : listMapBoolean.entrySet()) {
                if (entry.getKey().equals(i)) {
                    if(entry.getValue()) {
                        System.out.println("ToggleButton is checked!");
                    } else {
                        System.out.println("ToggleButton is not checked!");
                    }
                }
            }