【问题标题】:Switch changes ON-OFF when scrolled in Listview Android在 Listview Android 中滚动时开关更改 ON-OFF
【发布时间】:2015-01-23 10:34:30
【问题描述】:

我有一个带开关的 ListView。每当我打开开关并向下滚动并向上滚动时,开关就会变为关闭状态。

【问题讨论】:

  • 你需要使用 ViewHolder 来保存 switch 的状态...
  • @ChiragSavsani 正如您在我的代码中看到的那样,我已经在使用 Viewholder。但它仍然无法正常工作。我认为代码中有一些错误和缺失。具体这部分。 if(checkedItems.indexOf(accountList.get(position).toString()) >= 0)
  • @Cheskandroid 你的onChange 听众呢?
  • @Sufian Ive 已将其添加到代码中。请检查。
  • @Cheskandroid SparseBooleanArray checkedItems = new SparseBooleanArray();。嗯。

标签: android listview switch-statement


【解决方案1】:

把它放在你的自定义适配器中..

// 这两种方法允许在视图被回收时无需打开/关闭开关即可滚动 // 这些方法实际上告诉适配器不要回收行,因此可能会减慢进程

@Override
public int getViewTypeCount() {

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}

【讨论】:

  • 工作完美!
  • 为 Recyclerview 中的开关工作。通过添加 getItemViewType()
【解决方案2】:

我遇到过ListViews 的这个问题。试试这个

if(checkedItems.indexOf(accountList.get(position).toString()) >= 0) {
    holder.switchItem.setChecked(true);
}
else {
    holder.switchItem.setChecked(false);
}

您正在使用 checkItems 之前对其进行初始化。它目前是空的。 indexOf 里面什么都没有怎么办。

这应该可以解决您的问题

【讨论】:

  • 谢谢你,但我在“indexOf”部分出错,它说未定义。我该如何解决这个问题?
  • 是的,这是我的问题,如何获取所有勾选的项目并将其放入checkedItems?我需要帮助。
【解决方案3】:

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

更新 1:

在您的代码中:

  1. 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);
        }
    });
    
  2. holder.switchItem.setOnCheckedChangeListener(switchItemOnCheckedChangeListener); 替换为:

    //restore switch state
    holder.switchItem.setChecked(listView.isItemChecked(position));
    
  3. 删除以下代码:

    SparseBooleanArray checkedItems = new SparseBooleanArray();
    if (checkedItems.indexOf(accountList.get(position).toString()) >= 0) {
    
        holder.switchItem.setChecked(true);
    }
    

更新 2:

这是我的适配器的样子:

@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);

【讨论】:

  • 试过了,但它不起作用。请您参考我的代码。我只想要能够勾选开关 ON 或 OFF 以保持这种状态,即使我向下或向上滚动。
  • 我更改了代码,现在开关甚至无法打开。我应该把 holder.switchItem.setChecked(listView.isItemChecked(position));
  • 点击时Switch的状态没有变为ON?还是没有得到恢复?
  • 点击时它不会改变。它不会让我改变它。
  • 刚刚更新了我的答案。进行这些更改,如果仍然不起作用,请使用最新代码更新您的问题。
猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多