Android:ExpandableListViews和Checkboxes

时间:2010-09-02 12:33:08

标签: java android expandablelistview

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

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

我找到了这个教程,http://mylifewithandroid.blogspot.com/2010/02/expandable-lists-and-check-boxes.html,看起来很完美。然而,当我编译它并开始玩它时,我意识到它非常错。选中一个组中的一个框可能会导致另一个组中的随机框检查或取消选中。

这是我能找到的唯一一个教程,这似乎是一个可以在很多应用程序中使用的东西,所以我想知道,还有其他任何好的教程或资源可以解决这个问题吗? / p>

或者甚至更好,是否有人愿意展示他们自己的代码让这个工作......

由于

千电子伏

2 个答案:

答案 0 :(得分:3)

在为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内,你应该在受影响的实例上保存新状态(在我的例子中,是服务)。

我希望这有助于你

答案 1 :(得分:0)

我发现这是一个很好的指导方针,我们可以如何制作自定义列表视图,无论是复选框还是列表视图中的任何文本视图

http://techdroid.kbeanie.com/2009/07/custom-listview-for-android.html

谢谢..

勒凯什