如何在可扩展列表视图中访问某些孩子或所有孩子的某些内容(例如复选框)?

时间:2014-08-20 22:27:21

标签: android listview checkbox expandablelistview

我有两天这个问题,我在这里搜索解决方案,但没有找到任何东西。

问题如下: 我正在尝试设置复选框,这是可扩展列表视图的每个子项的一部分。 我正在尝试设置它们,当我设置另一个复选框时,它不是可扩展列表视图的一部分。

那么如何访问复选框?

我想从外部复选框的监听器访问它们。

chckbxAlleTage.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    int childrenCount = listAdapter.getChildrenCount(0);
                    if (chckbxAlleTage.isChecked()) {
                        for (int index = 0; index<childrenCount; index++ )
                        {
                            CheckBox tempchckBx = (CheckBox) (listAdapter.getChildView(
                                    0, index, true,findViewById(R.id.LinearLayout1) , expListView))
                                    .findViewById(R.id.chckBx);
                            tempchckBx.setChecked(true);
                        }
                        AnzahlTage = 7;

                    }else
                        {
                            AnzahlTage = 0;
                        }   

                    setEtAnzahlTage();
                }
            });

侦听器中此代码的结果是只选中了一个复选框。 我希望有人能说出来,这里有什么问题。

日Thnx

3 个答案:

答案 0 :(得分:0)

您需要通过更改支持适配器的数据而不是手动更改视图来处理此问题。无论如何,只要你滚动,适配器就会重新绘制视图。

你真正应该做的是更改适配器的支持DATA层,以便当适配器调用getView时,它可以检查天气是否应该检查框。将支持数据更改为适配器后,您可以在适配器上调用notifyDatasetChanged(),以便根据新数据重绘其视图。

如果您发布适配器代码,我可以更具体。

答案 1 :(得分:0)

谢谢你的回答。 这是适配器的代码

 private class ExpandableListAdapter extends BaseExpandableListAdapter {
    private Context _context;
    private List<String> _listDataHeader;       
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context,
            List<String> listDataHeader,
            HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(
                this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

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

    @SuppressLint("InflateParams")
    @Override
    public View getChildView(int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        CheckBox chckBx = (CheckBox) convertView.findViewById(R.id.chckBx);
        chckBx.setEnabled(false);
        if (allTageFlag) {
            chckBx.setChecked(true);
        }

        TextView tv = (TextView) convertView.findViewById(R.id.tv);
        tv.setText(childText);      

        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(
                this._listDataHeader.get(groupPosition)).size();
    }

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

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

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

    @SuppressLint("InflateParams")
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

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

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

这是案例just paste.it的屏幕截图! 。 (我不能在这里附上:)) 当我选中“Alla Tage”复选框

时,我想在可扩展列表视图中设置复选框

答案 2 :(得分:0)

我用以下方式解决它:

if (chckbxAlleTage.isChecked()) {

                        for (int index = 0; index < childrenCount; index++ )
                        {
                            if (listAdapter.isChildSelectable(0,index))
                            {   
                                CheckBox tempchckBx =  (CheckBox) (listAdapter.getChildView(
                                        0, index, false, expListView.getChildAt(index+1), expListView))
                                        .findViewById(R.id.chckBx);
                                tempchckBx.setChecked(true);
                            }
                        }       
                    }

使用“getChildAt”允许我访问listview的每个子项,然后选中每个子项的复选框,然后将它们设置为cheked。