我有一个ListView
,每个item
都包含一个ToggleButton
。在我切换它然后向上或向下滚动之后,ListView将回收视图,因此其他一些镜像镜像ToggleButton
的已检查状态。我不想要这个。我该如何预防?
答案 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)
可能您应该尝试创建自己的列表视图,其中包含滚动视图和一个容器,该容器包含以编程方式添加到容器中的子项。设置标识孩子的标签,或者你可以使用孩子的顺序