带有切换按钮的ListView,setChecked启动两个开关,并保存另一个的状态

时间:2015-11-26 15:48:16

标签: android android-listview switch-statement

我有两个问题:

我想要实现的是每行中都带有切换按钮的列表视图,并且它工作正常,但我想设置启动第4和第5开启True

holder.s.setChecked(possition == 4);

holder.s.setChecked(possition == 5);

设置为真仅为5,如何做到这一点,给我任何提示?

第二个问题:在滚动我的listview更改切换按钮的状态时,我尝试了很多教程,但没有运气,如何保持切换按钮的状态?

 @Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    String pytanie = getItem(position);


    if (convertView==null){
        convertView = inflater.inflate(R.layout.cardio_row, null);
        holder = new ViewHolder();
        holder.question = (TextView) convertView.findViewById(R.id.question);
        holder.s = (Switch)convertView.findViewById(R.id.switch1);
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }
    //Model_cardio question = getItem(position);
    holder.question.setText(pytanie);
    holder.s.setChecked(position == 4);
    holder.s.setChecked(position == 5);
    holder.s.setTag(position);


    return convertView;
}

编辑: 我已添加此内容,并希望将状态存储在某个列表中

  holder.s.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        }
    });

1 个答案:

答案 0 :(得分:2)

在您的代码中,这两个语句

holder.s.setChecked(position == 4);
holder.s.setChecked(position == 5);

一个接一个地执行。对于每个位置。

因此,对于位置编号4,第一个语句会导致Switch被检查,只能在以下语句中再次取消选中。

您可以引入boolean变量:

boolean doCheck = (position == 4) || (position == 5);
holder.s.setChecked(doCheck);

问题的棘手部分是如何跟踪已检查的列表行。 为此,您需要一种类似List

ArrayList<Integer> checkedRows;

在适配器的构造函数中,您可以根据需要初始化列表。

checkedList = new ArrayList();
// if you like, you can add rows 4 and 5 as checked now
// and drop the respective code in 'getView()':
checkedList.add(4);
checkedList.add(5);

然后在getView()方法中,检查每个View

holder.s.setTag(position);
holder.s.setOnCheckedChangeListener(null);

if (checkedList.contains(position) )
{
    holder.s.setChecked(true);
}
else
{
    holder.s.setChecked(false);
}

holder.s.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if (isChecked )
            {
                checkedList.add((Integer)buttonView.getTag() );
            }
            else
            {
                checkedList.remove((Integer)buttonView.getTag() );
            }
        }
};