我有一个带开关的ListView。每当我打开开关并向下滚动并向上滚动时,开关就会切换到关闭状态。
答案 0 :(得分:3)
将它放入自定义适配器..
//当这些视图被重新启动时,这两种方法可以在没有开关打开/关闭的情况下滚动 //这些方法实际上告诉适配器不回收行,因此可能会降低进程的速度
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
答案 1 :(得分:0)
我在ListView
s遇到了这个问题。试试这个
if(checkedItems.indexOf(accountList.get(position).toString()) >= 0) {
holder.switchItem.setChecked(true);
}
else {
holder.switchItem.setChecked(false);
}
您正在使用它之前初始化checkedItems。它目前是空的。如果没有任何内容,怎么能做indexOf。
这可以解决您的问题
答案 2 :(得分:0)
SparseBooleanArray
没有任何名为indexOf
的方法。
如果您只想存储已检查的状态,建议您使用ListView
内置的方法setItemChecked(int position, boolean value)
。
在getView()
中,您可以查看某个位置是否已经过检查(或者在您的情况下,您的交换机的状态是开启还是关闭),如下所示:
ListView listView = (ListView)parent; //get the listview
listView.setItemChecked(itemPosition, true); //set position as checked
listView.isItemChecked(position); //check if position is checked (switch is ON)
请务必在ListView
:
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
在您的代码中:
在holder.switchItem = (Switch) convertView.findViewById(R.id.switchItem);
之后,添加以下代码:
final ListView listView = (ListView)parent;
//add listener
holder.switchItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
listView.setItemChecked(position, isChecked);
}
});
将holder.switchItem.setOnCheckedChangeListener(switchItemOnCheckedChangeListener);
替换为:
//restore switch state
holder.switchItem.setChecked(listView.isItemChecked(position));
删除以下代码:
SparseBooleanArray checkedItems = new SparseBooleanArray();
if (checkedItems.indexOf(accountList.get(position).toString()) >= 0) {
holder.switchItem.setChecked(true);
}
这是我的适配器的样子:
@Override
public int getCount() {
return 50;
}
@Override
public String getItem(int position) {
return String.valueOf(position);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Holder holder;
final ListView listView = (ListView)parent;
if(convertView == null || convertView.getTag() == null) {
convertView = mInflator.inflate(R.layout.list_item, parent, false);
holder = new Holder();
holder.switch1 = (Switch) convertView.findViewById(R.id.switch1);
holder.switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
listView.setItemChecked(position, isChecked);
}
});
}
else {
holder = (Holder) convertView.getTag();
}
holder.switch1.setText(getItem(position));
//restore switch state
holder.switch1.setChecked(listView.isItemChecked(position));
return convertView;
}
这就是我在ListActivity
中设置列表视图的方式:
setListAdapter(new MyAdapter(this));
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);