【问题标题】:how to control state of checkbox of child view in ExpandableListview android如何在ExpandableListview android中控制子视图复选框的状态
【发布时间】:2015-03-04 06:22:30
【问题描述】:

在我的ExpandableListview 中,我使用类似于形状图像和名称的ImageviewCheckbox

当我勾选特定子项的checkbox 时,另一个子项也被勾选,滚动选中状态更改后,

我需要选择多个值。

请帮我解决这个问题,我非常需要这个。谷歌搜索但没有找到适合我的情况

提前致谢。

public View getChildView(int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {


_childText = (String) getChild(groupPosition, childPosition);     

int itemType = getChildType(groupPosition,childPosition);

Log.e("childPosition", "karjeevch "+childPosition);

ViewHolder viewHolder = null;
switch (itemType) {

case 0:
    viewHolder = null;
    if (convertView==null) {
        viewHolder=new ViewHolder();                
        convertView = infalInflater.inflate(R.layout.list_child_shape, null);
        viewHolder.shape_name = (CheckBox) convertView.findViewById(R.id.shape_chk_box);
        viewHolder.img_shape_icon=(ImageView)convertView.findViewById(R.id.img_shape);


        imageLoader.DisplayImage("http://rosycontact.com/shashvat/images/"+_childText+".png", viewHolder.img_shape_icon);
        viewHolder.shape_name.setText(_childText);
        convertView.setTag(viewHolder);


        final CheckBox shape_name_temp=viewHolder.shape_name;
        viewHolder.shape_name.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if (shape_name_temp.isChecked()==true) {
                    All_link.SHAPE=shape_name_temp.getText().toString();
                }
            }
        });


        //new PerformBackgroungTask().execute();
    }
    else{
        viewHolder=(ViewHolder)convertView.getTag();
    }
    return convertView;
    //break;



case 1:

    viewHolder = null;
    if (convertView==null) {
        viewHolder=new ViewHolder();
        convertView = infalInflater.inflate(R.layout.list_child_carat, null);
        viewHolder.carat_from = (TextView) convertView.findViewById(R.id.ed_carat_from);
        viewHolder.carat_to = (TextView) convertView.findViewById(R.id.ed_carat_to);

        viewHolder.carat_from.setText("jdsv");
        viewHolder.carat_to.setText("jdsv");

        All_link.CARAT_FROM=viewHolder.carat_from.getText().toString();
        All_link.CARAT_TO=viewHolder.carat_to.getText().toString();

    }
    else{
        viewHolder=(ViewHolder)convertView.getTag();
    }
    return convertView;


case 2: 

    viewHolder = null;
    if (convertView==null) {
        viewHolder=new ViewHolder(); 

        convertView = infalInflater.inflate(R.layout.list_child_color, null);
        viewHolder.color_from = (Spinner) convertView.findViewById(R.id.spn_color_from);
        viewHolder.color_to = (Spinner) convertView.findViewById(R.id.spn_color_to);


        ArrayAdapter adapter = new ArrayAdapter(_context, android.R.layout.simple_spinner_item, SearchActivity.color_list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);               
        viewHolder.color_from.setAdapter(adapter);
        viewHolder.color_to.setAdapter(adapter);

        convertView.setTag(viewHolder);

        final Spinner color_from_temp=viewHolder.color_from;
        final Spinner color_to_temp=viewHolder.color_to;

        // Changing textcolor
        viewHolder.color_from.setOnItemSelectedListener(new OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parent, View view,
                        int position, long id) {
                    // TODO Auto-generated method stub

                    All_link.COLOR_FROM=color_from_temp.getSelectedItem().toString();
                       ((TextView) parent.getChildAt(0)).setTextColor(Color.parseColor("#003974"));                         
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // TODO Auto-generated method stub                          
                }
            });
        viewHolder.color_to.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub

                All_link.COLOR_TO=color_to_temp.getSelectedItem().toString();
                   ((TextView) parent.getChildAt(0)).setTextColor(Color.parseColor("#003974"));                         
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub                          
            }
        });  
    }
    else{
        viewHolder=(ViewHolder)convertView.getTag();
    }
    return convertView;

【问题讨论】:

  • 再次 :) 你能把整个班级的例子发给你吗..我会在这里运行..为你找到问题 :) 如果可能的话,你可以把整个项目发给我..它会更多有助于查找

标签: android expandablelistview expandablelistadapter


【解决方案1】:

列表视图,回收器视图遵循延迟加载的概念,并重用您创建的视图。想象一下它就像一个屏幕可以容纳最大视图并且列表有 1000 个项目,android 对 1000 个项目使用相同的 10 个视图。您必须根据新项目的值更新新项目,并且您必须为每个新项目执行此操作,否则它将使用具有复选框选中状态的先前视图。我已经从理论上解释了它希望它有所帮助。 如果你想要一个实际的实现,请告诉我。

【讨论】:

    【解决方案2】:

    编辑

    我们看第一行:

    _childText = (String) getChild(groupPosition, childPosition);

    当您调用getChild() 时,您将获得项目视图的模型。因此,如果您的项目视图有一个复选框,那么您的模型中应该有某种布尔属性。你明白吗?您的视图和模型之间存在一对一的匹配。

    因此,例如,假设您的项目模型是类Shape,而不是字符串,它有一个名为marked 的布尔属性。让我们拥有文本属性name。所以我应该在你的代码中看到这样的内容:

    final Shape item = (shape) getChild(groupPosition, childPosition);
    ...
    viewHolder.shape_name = (CheckBox) convertView.findViewById(R.id.shape_chk_box);
    ...
    viewHolder.shape_name.setText(item.getName());
    viewHolder.shape_name.setChecked(item.isMarked());   //update view from model
    viewHolder.shape_name.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           ...
           item.setMarked(isChecked);   // update model from view
           }
        }
    });
    

    现在,如果您的字符串的值可以告诉您是否应该检查该项目,那么也许您不需要布尔属性。


    滚动选中状态更改后

    我在您的 getChildView() 方法中的任何地方都没有看到 shape_name.setChecked(),所以我可以告诉您发生了什么。

    请记住,ListView(和 ExpandableListView)会回收它们的视图,因此,如果您选中一个复选框,然后将其滚动到视图之外,当您将其滚动回视图时,您的 getChildView() 会再次被调用,从而设置视图复选框未选中

    当用户选中复选框时,您必须在 onCheckedChanged() 中更新 ListAdapter 中的模型,以便在重新创建视图时,您可以调用 shape_name.setChecked() 并设置复选框的正确状态。 ListView 没有任何固有状态;您的 ListAdapter 模型是 ListView 的唯一状态。

    此外,您仅在 convertView 为空时设置列表项。 convertView 是回收的列表项视图。如果它为空,则没有回收,因此您必须膨胀您的列表项视图并创建您的 ViewHolder。如果它不为空,那么您需要做的就是获取 ViewHolder。但无论哪种情况,您都必须执行 setText()、setChecked()、加载图像等操作,以便在回收视图时清除视图的旧状态。

    【讨论】:

    • 我在 if (convertView==null) 中重复了我的代码到 else 中,但没有膨胀布局也使用 setchecked true 和 false on statechanged ..但结果仍然相同
    • 请使用您正在使用的整个 ListAdapter 类更新您问题中的代码。
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多