ListView 复选框未正确更新

发布于 2024-11-16 05:51:39 字数 6806 浏览 8 评论 0原文

我有一个简单的适配器,带有重写的 getView 方法,该方法应该手动更新 CheckBoxes 以防止视图回收导致不必要的随机检查。因此,我为每个 checkbox 添加了 setChecked(boolean) ,尽管它仍然无法正确更新。我已经使用 Log 语句来查看布尔值是什么,并且复选框与布尔值不同。有人有什么建议吗?

谢谢!

代码在这里:

http://pastebin.com/MwgUc7Z8

    adapter = new SimpleAdapter(this, list, R.layout.rowsecond,
            new String[] { "icon", "name", "checkbox" }, new int[] {
                    R.id.image1, R.id.text1, R.id.checkbox }) {
        public View getView(int position, View convertView, ViewGroup parent) {

        //  View v = super.getView(position, convertView, parent);

            View v = convertView;
            if (v == null)
            {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = inflater.inflate(R.layout.rowsecond, null);
            }

            ImageView imgV = (ImageView)v.findViewById(R.id.image1);

            imgV.setImageDrawable(getResources().getDrawable(((Integer)list.get(position).get("icon")).intValue()));

            TextView tv = (TextView) v.findViewById(R.id.text1);

            tv.setText((String)list.get(position).get("name"));

            list.get(position).get("icon");




            boxer = (CheckBox) v.findViewById(R.id.checkbox);
            //

            boxer.setTag(new Integer(position));


            switch(position)
            {
            case 0: 
                boxer.setChecked(CategoriesFirst.fr_one);
                break;
            case 1:
                boxer.setChecked(CategoriesFirst.fr_two);
                break;
            case 2:
                boxer.setChecked(CategoriesFirst.fr_three);
                break;
            case 3:
                boxer.setChecked(CategoriesFirst.fr_four);
                break;
            case 4:
                boxer.setChecked(CategoriesFirst.fr_five);
                break;
            case 5:
                boxer.setChecked(CategoriesFirst.fr_six);
                break;
            case 6:
                boxer.setChecked(CategoriesFirst.fr_seven);
                break;
            case 7:
                boxer.setChecked(CategoriesFirst.fr_eight);
                break;
            case 8:
                boxer.setChecked(CategoriesFirst.fr_nine);
                break;
            case 9:
                boxer.setChecked(CategoriesFirst.fr_ten);
                break;
            case 10:
                boxer.setChecked(CategoriesFirst.fr_eleven);
                break;
            case 11:
                boxer.setChecked(CategoriesFirst.fr_twelve);
                break;
            case 12:
                boxer.setChecked(CategoriesFirst.fr_thirteen);
                break;
            case 13:
                boxer.setChecked(CategoriesFirst.fr_fourteen);
                break;




            }




            boxer.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    Integer posSelected = (Integer) buttonView.getTag();

                    int posSelectedint = posSelected.intValue();

                    switch (posSelectedint) {
                    // set static booleans
                    // REMEMBER BREAKS!
                    case 0:
                        CategoriesFirst.fr_one = !CategoriesFirst.fr_one;
                        break;
                    case 1:
                        CategoriesFirst.fr_two = !CategoriesFirst.fr_two;
                        break;
                    case 2:
                        CategoriesFirst.fr_three = !CategoriesFirst.fr_three;
                        break;
                    case 3:
                        CategoriesFirst.fr_four = !CategoriesFirst.fr_four;
                        break;
                    case 4:
                        CategoriesFirst.fr_five = !CategoriesFirst.fr_five;
                        break;
                    case 5:
                        CategoriesFirst.fr_six = !CategoriesFirst.fr_six;
                        break;
                    case 6:
                        CategoriesFirst.fr_seven = !CategoriesFirst.fr_seven;
                        break;
                    case 7:
                        CategoriesFirst.fr_eight = !CategoriesFirst.fr_eight;
                        break;
                    case 8:
                        CategoriesFirst.fr_nine = !CategoriesFirst.fr_nine;
                        break;
                    case 9:
                        CategoriesFirst.fr_ten = !CategoriesFirst.fr_ten;
                        break;
                    case 10:
                        CategoriesFirst.fr_eleven = !CategoriesFirst.fr_eleven;
                        break;
                    case 11:
                        CategoriesFirst.fr_twelve = !CategoriesFirst.fr_twelve;
                        break;
                    case 12:
                        CategoriesFirst.fr_thirteen = !CategoriesFirst.fr_thirteen;
                        break;
                    case 13:
                        CategoriesFirst.fr_fourteen = !CategoriesFirst.fr_fourteen;
                        break;
                    default:
                        break;
                    }



                    CategoriesFirst.save("fr_one",
                            CategoriesFirst.fr_one);
                    CategoriesFirst.save("fr_two",
                            CategoriesFirst.fr_two);
                    CategoriesFirst.save("fr_three",
                            CategoriesFirst.fr_three);
                    CategoriesFirst.save("fr_four",
                            CategoriesFirst.fr_four);
                    CategoriesFirst.save("fr_five",
                            CategoriesFirst.fr_five);
                    CategoriesFirst.save("fr_six",
                            CategoriesFirst.fr_six);
                    CategoriesFirst.save("fr_seven", CategoriesFirst.fr_seven);
                    CategoriesFirst.save("fr_eight", CategoriesFirst.fr_eight);
                    CategoriesFirst.save("fr_nine", CategoriesFirst.fr_nine);
                    CategoriesFirst.save("fr_ten", CategoriesFirst.fr_ten);

                    CategoriesFirst.save("fr_eleven", CategoriesFirst.fr_eleven);
                    CategoriesFirst.save("fr_twelve", CategoriesFirst.fr_twelve);
                    CategoriesFirst.save("fr_thirteen", CategoriesFirst.fr_thirteen);
                    CategoriesFirst.save("fr_fourteen", CategoriesFirst.fr_fourteen);
                }
            });


            return v;
        }

    };

I have a simple adapter with an overridden getView method that is supposed to manually update the CheckBoxes to prevent the unwanted random checking that results from view recycling. So I put setChecked(boolean) for each checkbox, though it still doesn't update correctly. I have used Log statements to see what the booleans are, and the checkboxes are not the same as the boolean values. Does anyone have any suggestions?

Thanks!

Code here:

http://pastebin.com/MwgUc7Z8

    adapter = new SimpleAdapter(this, list, R.layout.rowsecond,
            new String[] { "icon", "name", "checkbox" }, new int[] {
                    R.id.image1, R.id.text1, R.id.checkbox }) {
        public View getView(int position, View convertView, ViewGroup parent) {

        //  View v = super.getView(position, convertView, parent);

            View v = convertView;
            if (v == null)
            {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = inflater.inflate(R.layout.rowsecond, null);
            }

            ImageView imgV = (ImageView)v.findViewById(R.id.image1);

            imgV.setImageDrawable(getResources().getDrawable(((Integer)list.get(position).get("icon")).intValue()));

            TextView tv = (TextView) v.findViewById(R.id.text1);

            tv.setText((String)list.get(position).get("name"));

            list.get(position).get("icon");




            boxer = (CheckBox) v.findViewById(R.id.checkbox);
            //

            boxer.setTag(new Integer(position));


            switch(position)
            {
            case 0: 
                boxer.setChecked(CategoriesFirst.fr_one);
                break;
            case 1:
                boxer.setChecked(CategoriesFirst.fr_two);
                break;
            case 2:
                boxer.setChecked(CategoriesFirst.fr_three);
                break;
            case 3:
                boxer.setChecked(CategoriesFirst.fr_four);
                break;
            case 4:
                boxer.setChecked(CategoriesFirst.fr_five);
                break;
            case 5:
                boxer.setChecked(CategoriesFirst.fr_six);
                break;
            case 6:
                boxer.setChecked(CategoriesFirst.fr_seven);
                break;
            case 7:
                boxer.setChecked(CategoriesFirst.fr_eight);
                break;
            case 8:
                boxer.setChecked(CategoriesFirst.fr_nine);
                break;
            case 9:
                boxer.setChecked(CategoriesFirst.fr_ten);
                break;
            case 10:
                boxer.setChecked(CategoriesFirst.fr_eleven);
                break;
            case 11:
                boxer.setChecked(CategoriesFirst.fr_twelve);
                break;
            case 12:
                boxer.setChecked(CategoriesFirst.fr_thirteen);
                break;
            case 13:
                boxer.setChecked(CategoriesFirst.fr_fourteen);
                break;




            }




            boxer.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    Integer posSelected = (Integer) buttonView.getTag();

                    int posSelectedint = posSelected.intValue();

                    switch (posSelectedint) {
                    // set static booleans
                    // REMEMBER BREAKS!
                    case 0:
                        CategoriesFirst.fr_one = !CategoriesFirst.fr_one;
                        break;
                    case 1:
                        CategoriesFirst.fr_two = !CategoriesFirst.fr_two;
                        break;
                    case 2:
                        CategoriesFirst.fr_three = !CategoriesFirst.fr_three;
                        break;
                    case 3:
                        CategoriesFirst.fr_four = !CategoriesFirst.fr_four;
                        break;
                    case 4:
                        CategoriesFirst.fr_five = !CategoriesFirst.fr_five;
                        break;
                    case 5:
                        CategoriesFirst.fr_six = !CategoriesFirst.fr_six;
                        break;
                    case 6:
                        CategoriesFirst.fr_seven = !CategoriesFirst.fr_seven;
                        break;
                    case 7:
                        CategoriesFirst.fr_eight = !CategoriesFirst.fr_eight;
                        break;
                    case 8:
                        CategoriesFirst.fr_nine = !CategoriesFirst.fr_nine;
                        break;
                    case 9:
                        CategoriesFirst.fr_ten = !CategoriesFirst.fr_ten;
                        break;
                    case 10:
                        CategoriesFirst.fr_eleven = !CategoriesFirst.fr_eleven;
                        break;
                    case 11:
                        CategoriesFirst.fr_twelve = !CategoriesFirst.fr_twelve;
                        break;
                    case 12:
                        CategoriesFirst.fr_thirteen = !CategoriesFirst.fr_thirteen;
                        break;
                    case 13:
                        CategoriesFirst.fr_fourteen = !CategoriesFirst.fr_fourteen;
                        break;
                    default:
                        break;
                    }



                    CategoriesFirst.save("fr_one",
                            CategoriesFirst.fr_one);
                    CategoriesFirst.save("fr_two",
                            CategoriesFirst.fr_two);
                    CategoriesFirst.save("fr_three",
                            CategoriesFirst.fr_three);
                    CategoriesFirst.save("fr_four",
                            CategoriesFirst.fr_four);
                    CategoriesFirst.save("fr_five",
                            CategoriesFirst.fr_five);
                    CategoriesFirst.save("fr_six",
                            CategoriesFirst.fr_six);
                    CategoriesFirst.save("fr_seven", CategoriesFirst.fr_seven);
                    CategoriesFirst.save("fr_eight", CategoriesFirst.fr_eight);
                    CategoriesFirst.save("fr_nine", CategoriesFirst.fr_nine);
                    CategoriesFirst.save("fr_ten", CategoriesFirst.fr_ten);

                    CategoriesFirst.save("fr_eleven", CategoriesFirst.fr_eleven);
                    CategoriesFirst.save("fr_twelve", CategoriesFirst.fr_twelve);
                    CategoriesFirst.save("fr_thirteen", CategoriesFirst.fr_thirteen);
                    CategoriesFirst.save("fr_fourteen", CategoriesFirst.fr_fourteen);
                }
            });


            return v;
        }

    };

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

乖不如嘢 2024-11-23 05:51:39

这是很久以前的事了,但我可能会帮助处于相同情况的人。我解决了通知适配器中数据集更改的问题。 expandablelistview.notifyDataSetChanged(); 设置此选项后,即使在使用 isChecked() 检查状态后,UI 也会在列表中做出每个选择后更新;

It was quite long ago, but I might help somebody that is in the same situation. I solved the problem notifying the data set changed in the adapter. expandablelistview.notifyDataSetChanged(); After setting this, the UI was updating after each choice made in the list even after checking the state using isChecked();

新雨望断虹 2024-11-23 05:51:39

您是否尝试在 switch 子句之前设置 boxer.setChecked(false) ?因为这会重置所有复选框。

Did you try setting boxer.setChecked(false) before the switch clause? Because that would reset all the checkboxes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文