在安卓中,BaseAdapter和Checkbox列表中的notifyDataSetChanged()方法不起作用

3

https://istack.dev59.com/vUpUM.webp

我已经将listview和checkbox作为列表项。如您在图像描述中所见,Action Master是父级,Add和Delete是子级。父级和子级由代码分开。现在选中Action Master后,Add和Delete也应该被选中,反之亦然。一切都运行良好,但主要问题是当我们点击Action Master时,整个列表应该刷新,ADD和DELETE应该被选中,但它不会出现在UI上,简而言之,我在日志中得到了结果,但在UI中没有。

这是我的填充代码:

dataAdapter = new MyCustomAdapter(AddRolePermission.this, listPageActionMaster);
listView.setAdapter(dataAdapter);

这是自定义适配器的代码:

class MyCustomAdapter extends BaseAdapter{


    AddRolePermission addRolePermission;
    List<ClsPageActionMaster> list_role_master;


    public MyCustomAdapter(AddRolePermission addRolePermission, List<ClsPageActionMaster> lstDemo) {
        this.addRolePermission=addRolePermission;
        this.list_role_master=lstDemo;
    }

    @Override
    public int getCount() {
        return list_role_master.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            ///
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.permissions_checkbox, null);



            CheckBox checkBox1 = (CheckBox) convertView.findViewById(R.id.checkBox1);
            TextView pageid = (TextView) convertView.findViewById(R.id.pageid);

            ClsPageActionMaster ObjPageAction = new ClsPageActionMaster();
            ObjPageAction = list_role_master.get(position);


            Log.v("RolePermissionData", "BEFORE CHECKED");
            Log.v("RolePermissionData", "CheckBox-" + String.valueOf(ObjPageAction.getSelected()));
            Log.v("RolePermissionData", "PageID-" + String.valueOf(ObjPageAction.getPageid()));
            Log.v("RolePermissionData", "PageName-" + String.valueOf(ObjPageAction.getPage_name()));
            Log.v("RolePermissionData", "type" + String.valueOf(ObjPageAction.getType()));
            Log.v("RolePermissionData", "position" + String.valueOf(position));
            Log.v("RolePermissionData", "ActionName" + String.valueOf(ObjPageAction.getAction_name()));


            if (ObjPageAction.getType().toString().equalsIgnoreCase("parent")) {
                checkBox1.setText("  " + ObjPageAction.getPage_name());
                checkBox1.setTypeface(null, Typeface.BOLD);

            } else {
                checkBox1.setText("        " + ObjPageAction.getAction_name());
            }
            checkBox1.setChecked(ObjPageAction.getSelected());
            pageid.setText(String.valueOf(ObjPageAction.getPageid()));
            checkBox1.setTag(String.valueOf(position));

            checkBox1.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;

                    Toast.makeText(AddRolePermission.this, cb.getText().toString()+"-"+cb.isChecked(), Toast.LENGTH_SHORT).show();

                    Integer _POSSITION = Integer.parseInt(String.valueOf(cb.getTag()));
                    ClsPageActionMaster _ObjAction = list_role_master.get(_POSSITION);

                    //check is parent? or not
                    //if yes then find all chied and check them if not
                    if (_ObjAction.getType().equalsIgnoreCase("parent")) {

                        Log.v("CHECKBOXlist", "parent true -" + String.valueOf(_ObjAction.getSelected()));
                        Integer _parentPageID = _ObjAction.getPageid();
                        Log.v("CHECKBOXlist", "_parentPageID -" + String.valueOf(_parentPageID));
                        for (ClsPageActionMaster ObjPageActionMaster : list_role_master) {
                            if (_parentPageID == ObjPageActionMaster.getPageid()) {
                                Log.v("CHECKBOXlist", "pageid == actionPagID -" + String.valueOf(_ObjAction.getPageid()));
                                Log.v("CHECKBOXlist", "_parentPageID -" + String.valueOf(ObjPageActionMaster.getPageid()));
                                ObjPageActionMaster.setSelected(cb.isChecked());
                                list_role_master.set(list_role_master.indexOf(ObjPageActionMaster), ObjPageActionMaster);
                            }
                        }

                        dataAdapter.notifyDataSetChanged();
                    } else {
                        Log.v("CHECKBOXlist", "CHK_CHECKED-" + String.valueOf(_ObjAction.getSelected()));
                        _ObjAction.setSelected(cb.isChecked());
                        list_role_master.set(_POSSITION, _ObjAction);
                    }


                    Log.v("CHECKBOXlist", "AFTER CHECKED");
                    Log.v("CHECKBOXlist", "CHK_POSITION-" + String.valueOf(_POSSITION));
                    Log.v("CHECKBOXlist", "CHK_ID-" + String.valueOf(_ObjAction.getId()));
                    Log.v("CHECKBOXlist", "chk_name-" + String.valueOf(_ObjAction.getAction_name()));
                    Log.v("CHECKBOXlist", "type" + String.valueOf(_ObjAction.getType()));
                    Log.v("CHECKBOXlist", "Position" + String.valueOf(position));
                    Log.v("CHECKBOXlist", "CHK_CHECKED-" + String.valueOf(_ObjAction.getSelected()));
                }
            });

        }
        return convertView;
    }
}

即使我已经写了 dataAdapter.notifyDataSetChanged(); ,但刷新仍然没有生效。我在适配器中编写了复选框单击事件,所以如何刷新是个问题,每次单击复选框都应该刷新,这样我才能得到所需的输出。感谢您的帮助。谢谢。


你不需要声明自定义适配器,而是在复选框点击事件中修改传递给适配器的列表,并在列表更新后使用dataAdapter.notifyDataSetChanged()。希望这对你有用。 - Shashwat Gupta
你能给我展示一些代码吗?因为我不太明白... @GuptaShashwat - Nathani Software
1个回答

0
假设您有一个列表和适配器:
ArrayList<String> my_list=new ArrayList<>();
my_list.add(contents);
ArrayAdapter<> my_adapter = new ArrayAdapter<>(AgentCreateIntimation.this, android.R.layout.simple_spinner_dropdown_item, my_list);

找到你的复选框

CheckBox ChkBx = ( CheckBox ) findViewById( R.id.checkbox );
ChkBx.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
my_list.add(contents);
my_adapter.notifyDataSetChanged()
            // perform logic
        }

    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接