ListView重用视图...我不想要它

时间:2011-08-03 03:57:58

标签: android

我有一个ListView,每个item都包含一个ToggleButton。在我切换它然后向上或向下滚动之后,ListView将回收视图,因此其他一些镜像镜像ToggleButton的已检查状态。我不想要这个。我该如何预防?

4 个答案:

答案 0 :(得分:76)

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

@Override

public int getViewTypeCount() {                 

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}

答案 1 :(得分:50)

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;
}

mToggles在适配器中声明为私有属性,并使用如下公共方法进行设置:

public void setToggleList( ArrayList<Boolean> list ){
        this.mToggles = list;
        notifyDataSetChanged();
    }

有关详细信息,请查看其他自定义ListView示例。

希望它有所帮助。

答案 2 :(得分:3)

您可以使用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);
                        }
                    }
                });

在给视图充气后,您会阅读HashMap以查看是否已检查过:

 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!");
                    }
                }
            }

不确定它是否对您有所帮助。我在EditText中回收ListView时遇到了问题。

答案 3 :(得分:0)

可能您应该尝试创建自己的列表视图,其中包含滚动视图和一个容器,该容器包含以编程方式添加到容器中的子项。设置标识孩子的标签,或者你可以使用孩子的顺序