Android:自定义列表适配器中的Switch问题

时间:2017-06-23 10:08:59

标签: android listview debugging object switch-statement

我有一个模板页面,在这个页面上我可以添加和删除模板,为它们命名和描述。

每个模板都是一个由名称,描述,电源和启用组成的对象。

  • 点击模板会加载另一个包含选项的列表视图。
  • 每个选项都是名为Option的对象的实例。
  • 每个选项都有一个我可以切换的开关。
  • 当我保存模板时,我会更新数据库中有关这些开关是打开还是关闭的值。

正确地跳到了问题所在。

我们可以移过第一个模板列表视图,但可以移动到下一个模板列表视图,即选项列表视图。

此列表视图仅包含2个选项,Power和Enable。以下是我创建这些选项的方法。

TEMPLATEPOWER("Turn on device", "Switching this will turn on and off the fitting"),
TEMPLATEENABLED("Enable Device", "Switching this will enable and disable the device");
  • 简单来说,它只是一个枚举
  • 然后我有一个控制选项来处理这个枚举。

控制文件:

  public ArrayList<Option> populateTemplateActions() {
    actions.add(Option.TEMPLATEPOWER);
    actions.add(Option.TEMPLATEENABLED);
    return actions;
}

现在设置列表视图。要做到这一点:

  • 我创建了一个选项数组,并调用上面的方法将这些枚举对象添加到数组
  • 然后我将此数组传递给适配器。
  • 我也将片段传递过来,因为我需要能够在片段中设置Template对象。

填充数组:

templateOptions = control.populateTemplateActions();

创建列表视图:

adapter = new TemplateOptionAdapter(
                getActivity(), templateOptions, template, ViewTemplate.this);
        templateOptionsView.setAdapter(adapter);

        adapter.notifyDataSetChanged();

一旦我进入适配器,我就设置了文本视图和开关。然后,我通过在交换机上使用更改侦听器来处理设置电源和启用选项。

  • 我首先检查选项行对象,看它是否为a)Power或b)启用。
  • 然后我将其设置为选中或未选中。
  • 然后,侦听器侦听更改,并在发生更改时相应地设置方法。
  • 然后我将这个更改的对象传回到包含列表视图的片段中,这样我就可以将值插入到数据库中。

为了彻底,我将在下面发布整个适配器代码:

public class TemplateOptionAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<Option> templateList;
    private String name;
    private Template template;
    private Boolean checked;
    int power;
    int enable;
    Option option;
    ViewTemplate viewTemplate;

    public TemplateOptionAdapter(Context context, ArrayList<Option> list, Template template, ViewTemplate viewTemplate) {
        this.context = context;
        templateList = list;
        this.template = template;
        this.viewTemplate = viewTemplate;
    }

    @Override
    public int getCount() {

        return templateList.size();
    }

    @Override
    public Object getItem(int position) {

        return templateList.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        option = templateList.get(position);

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.template_option_view_row, null);

        }
        TextView templateName = (TextView) convertView.findViewById(R.id.option_name);
        TextView templateDesc = (TextView) convertView.findViewById(R.id.option_info);
        SwitchCompat optionSwitch = convertView.findViewById(R.id.optionSwitch);

        name = option.getOptionName();
        String description = option.getOptionDesc();

        templateName.setText(name);
        templateDesc.setText(description);

        power = template.getTemplatePower();
        enable = template.getTemplateStatus();

        // Sets switches to their database values
        switch (option) {
            case TEMPLATEPOWER:
                if (power == 0) {
                    optionSwitch.setChecked(false);
                }

                else {
                    optionSwitch.setChecked(true);
                }
                break;
            case TEMPLATEENABLED:
                if (enable == 0) {
                    optionSwitch.setChecked(false);
                }

                else {
                    optionSwitch.setChecked(true);
                }
                break;
        }

        // Monitors changing of switches and sets objects to be saved.

        optionSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    checked = true;
                    switch (option) {
                        case TEMPLATEPOWER:
                            template.setTemplatePower(1);
                            Log.i("power", "power setting to 1" + "");
                            Log.i("enable", "enable dosnt change" + "");
                            break;
                        case TEMPLATEENABLED:
                            template.setTemplateStatus(1);
                            Log.i("power", "power dosnt change" + "");
                            Log.i("enable", "enable setting to 1" + "");
                            break;
                    }
                } else {
                    checked = false;
                    switch (option) {
                        case TEMPLATEPOWER:
                            template.setTemplatePower(0);
                            Log.i("power", "power setting to 1" + "");
                            Log.i("enable", "enable dosnt change" + "");
                            break;
                        case TEMPLATEENABLED:
                            template.setTemplateStatus(0);
                            Log.i("power", "power dosnt change" + "");
                            Log.i("enable", "enable setting to 0" + "");
                            break;
                    }
                }
            }

        });

        viewTemplate.setTemplate(template);
        return convertView;
    }
哇,如果你还和我在一起很棒,谢谢!

好的,所以手头的问题。

当我回到包含列表视图的片段中时,单击按钮进行保存时: 无论我切换,打开电源还是启用,启用选项都是唯一可以更改的值。例如:

  • 如果我将电源设置为on,则将enable设置为on。
  • 如果我将电源设为关闭,则取消启用。

所以在我的switch语句中,似乎从未见过TEMPLATEPOWER,即使它是其中一个选项。

我是一名新手Android开发者,我确信这是我逻辑上的一个缺陷,我只是看不到哪里!

任何建议都会很棒,谢谢!

如果您需要进一步澄清,请询问:)

1 个答案:

答案 0 :(得分:0)

可能有更好的方法来执行这整个功能,但经过几个小时的尝试修复我的案例,我已经管理了一些事情。

我在适配器中使用列表位置获取对象选项时,我应该将其设置为final,因为它会不断更改值。

我改变了:

option = templateList.get(position);

要:

final Option option = templateList.get(position);