1

我是 Android 平台的新手,但不是 java 的新手。

问题:

每次我选择 ToggleButton,whitch 都在 ArrayAdapter 中,然后选择了一个以上的 ToggleButton。

private Context context;
private List<DayListItem> list;

public DayListAdapter(Context context, List<DayListItem> objects) {
    super(context, R.layout.day_row, objects);
    this.context = context;
    this.list = objects;
}

@Override
public int getPosition(DayListItem item) {
    return list.indexOf(item);
}

@Override
public int getCount() {
    return list!=null?list.size():0;
}

static class ViewHolder{
    protected RelativeLayout rl;
    protected TextView position;
    protected TextView time;
    protected TextView info;
    protected ToggleButton button;
}

@Override
public DayListItem getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return list.get(position).getID();
}

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    View view = convertView;
    final ViewHolder viewHolder;
    if(view == null){
        LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflate.inflate(R.layout.day_row, null);
        viewHolder = new ViewHolder();
        viewHolder.rl = (RelativeLayout) view.findViewById(R.id.alarmCLICK);
        viewHolder.position = (TextView) view.findViewById(R.id.alarmPOSITION);
        viewHolder.time = (TextView) view.findViewById(R.id.alarmSETtime);
        viewHolder.info = (TextView) view.findViewById(R.id.alarmINFO);
        viewHolder.button = (ToggleButton) view.findViewById(R.id.alarmTOGGLE);

        view.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) view.getTag();
    }
    viewHolder.time.setText(list.get(position).getTime());
    viewHolder.info.setText(list.get(position).getInfo());
    viewHolder.position.setText(String.valueOf(position));
    viewHolder.button.setSelected(list.get(position).isSelected());
    viewHolder.rl.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Dialog dialog = new Dialog(v.getContext());
            dialog.setContentView(R.layout.alarm_list);
            dialog.setTitle(String.valueOf(position));
            dialog.setCancelable(true); 
            dialog.show();
        }
    });
    viewHolder.button.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            if(viewHolder.button.isChecked()){
                Log.w("position",String.valueOf(position));
                list.get(position).setSelected(true);
            }else list.get(position).setSelected(false);
        }
    });     
    return view;
}

我不知道为什么每次移动列表时都会重新绘制 ToggleButtons。

4

1 回答 1

2

您正在使用自定义适配器。在这里我正在编写解决方案,使用它可以解决您的问题。我也从复选框面临同样的问题。试试这个。首先将切换按钮的状态保存到数组列表中。

私有 ArrayList toggle_state = null;

然后我将在自定义适配器构造函数中将所有状态设置为 false:

for (int i=0; i < no_of_elements.size(); i++) {
    itemChecked.add(i, false);
}

设置按钮单击时的实际切换状态:

    holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                                     boolean isChecked) {
            itemChecked.set(position, isChecked);

        }
    });

其中 cb 是切换按钮。

在自定义适配器的 getView 方法中写入:

holder.cb.setChecked(itemChecked.get(position));

这将解决您的问题。

于 2012-05-16T04:30:59.700 回答