当前位置: 首页 > 面试题库 >

Android:ExpandableListViews和复选框

罗新
2023-03-14
问题内容

我最近在玩扩展列表视图。

我正在尝试获得一个具有复选框作为子视图元素之一的列表视图。

我在http://mylifewithandroid.blogspot.com/2010/02/expandable-lists-and-check-
boxes.html
找到了本教程,它看起来很完美。但是,当我编译并开始使用它时,我意识到它的故障很大。选中一个组中的一个框可能导致另一个组中的一个随机框被选中或取消选中。

这是我可以找到的唯一教程,似乎可以在许多应用程序中使用,所以我想知道是否还有其他好的教程或资源可以解决这个问题?

甚至更好的是,有人愿意显示自己的代码使它起作用吗?

谢谢

凯夫


问题答案:

在为Android开发nagios客户端时,我遇到了同样的问题,我发现,这是至关重要的,因为您必须在两者中将新值分配给convertView参数

  • public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
  • public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)

BaseExpandableListAdapter扩展中的方法

否则,父/子渲染器将从缓存中构建,并且它们不会向您显示正确的内容。

我需要该复选框来显示用户是否需要某种警报来监视服务是否出了问题。

这是我实现这一目标的方法:

//hosts: the list of data used to build up the hierarchy shown by this adapter's parent list.
private class MyExpandableListAdapter extends BaseExpandableListAdapter
{
    private LayoutInflater inflater;

    public MyExpandableListAdapter()
    {
        inflater = LayoutInflater.from(Binding.this);
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
    {
        final Host host = hosts.get(groupPosition);
        final boolean needsLargeView = isExpanded && (host.getTitle() != null) && (host.getTitle().length() > 0);
        if (needsLargeView)
            convertView = inflater.inflate(R.layout.grouprow_expanded, parent, false);
        else
            convertView = inflater.inflate(R.layout.grouprow, parent, false);
        convertView.setBackgroundResource(host.getBackgroundResource(isExpanded));
        [...]
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
    {
        final Host host = hosts.get(groupPosition);
        final NagService service = host.getServices().get(childPosition);
        convertView = inflater.inflate(R.layout.childrow, parent, false);
        convertView.setBackgroundResource(host.getChildBackgroundResource());
        convertView.findViewById(R.id.servicename_status).setBackgroundResource(service.getStatusBackground());
        [...]
        CheckBox alertChb = (CheckBox) convertView.findViewById(R.id.alert);
        alertChb.setChecked(service.isNeedsAlert());
        alertChb.setOnCheckedChangeListener(new YourCheckChangedListener(service));
        return convertView;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition)
    {
        return hosts.get(groupPosition).getServices().get(childPosition);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition)
    {
        return childPosition;
    }

    @Override
    public int getChildrenCount(int groupPosition)
    {
        return hosts.get(groupPosition).getServices().size();
    }

    @Override
    public Object getGroup(int groupPosition)
    {
        return hosts.get(groupPosition);
    }

    @Override
    public int getGroupCount()
    {
        return hosts.size();
    }

    @Override
    public long getGroupId(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public void notifyDataSetChanged()
    {
        super.notifyDataSetChanged();
    }

    @Override
    public boolean isEmpty()
    {
        return ((hosts == null) || hosts.isEmpty());
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }

    @Override
    public boolean hasStableIds()
    {
        return true;
    }

    @Override
    public boolean areAllItemsEnabled()
    {
        return true;
    }
}

所使用的布局中的childrow.xml是包含复选框的布局。

在内部,CheckedChanhedListener您应将新状态保存在受影响的实例上(在我的情况下是服务)。

我希望这可以帮助你



 类似资料:
  • 这是一个 列表 拓展,可以用来创建单选和复选按钮组。 复选按钮组 <div class="list-block"> <ul> <!-- Single chekbox item --> <li> <label class="label-checkbox item-content"> <!-- Checked by default -->

  • 本文向大家介绍jQuery实现复选框的全选和反选,包括了jQuery实现复选框的全选和反选的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 我在应用程序中遇到复选框选择问题。我在一个页面上有一个dataTable(index.xhtml)。在同一个页面上有一个ajax按钮,当用户单击它时,应用程序应该导航到另一个页面(detail.xhtml)。详细信息页面包含用于导航回索引的返回按钮。xhtml。导航有效,但当用户从详细信息页面返回时,当用户单击dataTable时,dataTable中的行复选框不会被选中(选中所有行的标题复选框有

  • 这会找到我想要的节点吗?如果没有,我如何获得节点并正确地更改属性? 谢谢。马格努斯

  • 本文向大家介绍JavaScript实现复选框全选和取消全选,包括了JavaScript实现复选框全选和取消全选的使用技巧和注意事项,需要的朋友参考一下 JS网页–全选和取消全选,供大家参考,具体内容如下 表格,初始状态下复选框都是未选中状态,选中表头的复选框后,下面几个复选框变为选中状态,取消表头复选框选中状态后,下面几个复选框选中状态也随之取消;下面的几个复选框同时选中时,表头的复选框也随之选中

  • 问题内容: 我正在尝试以减轻痛苦的适当方式进行操作,但是我无法弄清楚如何处理ng-model并将其绑定到所选列表等,而且我需要在以后填充该列表并保留所选对象在里面。 每次填充列表时,我都必须覆盖类别,因为它将从服务器中拉出。 所以我想我需要数组,第二个数组将容纳所选对象? 如果我是对的,如何预选复选框? 我是否需要ng-click命令调用自定义函数才能将所选对象存储在另一个数组中? 我需要在复选框