如何处理CustomArrayAdapter中的复选框

艾薇薇

我正在尝试处理CustomArrayAdapter内的一组复选框的“选中/取消选中”。

要求是,当我“选中”一个复选框时,其他复选框应根据特定条件保持选中/未选中状态。

我正在计划的方法是将所有“复选框”对象存储在ArrayList中,然后使用“ gson”将它们添加到我的SharedPreferences文件中。当我“选中”一个复选框时,我将检索它们中的每个复选框,并根据我的标准更改复选框的状态。

由于某种原因,在SharedPreferences中存储一个'Checkbox'对象会使编译器陷入无限循环,并且我得到以下堆栈日志:

09-05 07:52:20.186 1560-1600/millennia.sniffbt I/OpenGLRenderer: Initialized EGL, version 1.4
09-05 07:52:20.187 1560-1600/millennia.sniffbt D/OpenGLRenderer: Swap behavior 1
09-05 07:52:44.803 1560-1565/millennia.sniffbt I/art: Do partial code cache collection, code=124KB, data=100KB
09-05 07:52:44.804 1560-1565/millennia.sniffbt I/art: After code cache collection, code=124KB, data=100KB
09-05 07:52:44.804 1560-1565/millennia.sniffbt I/art: Increasing code cache capacity to 512KB
09-05 07:52:46.339 1560-1567/millennia.sniffbt W/art: Suspending all threads took: 16.280ms
09-05 07:52:48.700 1560-1571/millennia.sniffbt I/art: Background partial concurrent mark sweep GC freed 284903(5MB) AllocSpace objects, 20(1932KB) LOS objects, 37% free, 26MB/42MB, paused 4.525ms total 115.535ms
09-05 07:52:49.627 1560-1571/millennia.sniffbt I/art: Background sticky concurrent mark sweep GC freed 517140(8MB) AllocSpace objects, 31(3MB) LOS objects, 25% free, 31MB/42MB, paused 5.249ms total 97.072ms
09-05 07:52:49.976 1560-1567/millennia.sniffbt W/art: Suspending all threads took: 15.674ms
09-05 07:52:50.410 1560-1571/millennia.sniffbt I/art: Background sticky concurrent mark sweep GC freed 368915(6MB) AllocSpace objects, 20(2MB) LOS objects, 16% free, 35MB/42MB, paused 5.346ms total 90.929ms
09-05 07:52:50.804 1560-1571/millennia.sniffbt I/art: Background sticky concurrent mark sweep GC freed 293352(5MB) AllocSpace objects, 17(2MB) LOS objects, 13% free, 36MB/42MB, paused 5.083ms total 93.860ms
09-05 07:52:51.226 1560-1571/millennia.sniffbt I/art: Background partial concurrent mark sweep GC freed 333422(5MB) AllocSpace objects, 19(2MB) LOS objects, 29% free, 37MB/53MB, paused 6.722ms total 178.796ms
09-05 07:52:51.813 1560-1571/millennia.sniffbt I/art: Background sticky concurrent mark sweep GC freed 602192(10MB) AllocSpace objects, 30(3MB) LOS objects, 23% free, 40MB/53MB, paused 6.137ms total 117.126ms
09-05 07:52:52.374 1560-1571/millennia.sniffbt I/art: Background sticky concurrent mark sweep GC freed 506509(8MB) AllocSpace objects, 24(3MB) LOS objects, 19% free, 42MB/53MB, paused 6.292ms total 112.676ms
09-05 07:52:52.605 1560-1567/millennia.sniffbt W/art: Debugger attempted to resume all threads without having suspended them all before.
09-05 07:52:52.615 1560-1567/millennia.sniffbt I/art: Debugger is no longer active

这是我的CustomArrayAdapter

CustomArrayAdapter.java:

public class CustomArrayAdapter extends ArrayAdapter<Row> {
    Row[] rowItems = null;
    Context context;
    SharedPreferences appPrefs;

public CustomArrayAdapter(MyInterface fragmentActivity, Context context, Row[] resource) {
    super(context, R.layout.row_with_cb, resource);
    this.rowItems = resource;
    this.context = context;
    cf = new CommonFunctions();
    appPrefs = getContext().getSharedPreferences(getContext().getString(R.string.app_shared_pref_filename), Context.MODE_PRIVATE);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = ((Activity)this.context).getLayoutInflater();
    convertView = inflater.inflate(R.layout.row_with_cb, parent, false);
    TextView name = (TextView)convertView.findViewById(R.id.row_with_cb_Txt);
    CheckBox cb = (CheckBox)convertView.findViewById(R.id.row_with_cb_ChkBox);

    // Add Checkboxes into ArrayList and store em away
    ArrayList<CheckBox> arrCheckBoxes = new ArrayList<>();
    arrCheckBoxes.add(cb);

    SharedPreferences.Editor prefEditor = appPrefs.edit();
    Gson gson = new Gson();
    String json;
    Type typeOfObject = new TypeToken<ArrayList<CheckBox>>(){}.getType();
    json = gson.toJson(arrCheckBoxes, typeOfObject); // MY COMPILER GOES INTO INFINITE LOOP HERE
    prefEditor.putString("ListOfChkBoxes", json);
    prefEditor.apply();

    // Create a onClickListener when a checkbox is selected
    cb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            CheckBox cb = (CheckBox) v;
            rowItems[position].setCB(cb.isChecked());
        }
    });

    return convertView;
}

我有两个问题:

  1. 为什么存储“复选框”会使编译器陷入无限循环?
  2. 有没有更好的方法来存储和检索复选框?
艾薇薇

该解决方案比我预期的要简单得多。感谢@Himani的评论。

我在getView函数中创建的ArrayList仍然有效,即使选中了另一个复选框,它也具有所有详细信息供我操作该复选框。

这是代码:

public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = ((Activity)this.context).getLayoutInflater();
    convertView = inflater.inflate(R.layout.row_with_cb, parent, false);
    TextView name = (TextView)convertView.findViewById(R.id.row_with_cb_Txt);
    CheckBox cb = (CheckBox)convertView.findViewById(R.id.row_with_cb_ChkBox);

    arrCheckBoxes.add(cb); // THIS ARRAY ALWAYS REMAINS UPDATED INSIDE ONCLICKLISTENER

    // Create a onClickListener when a checkbox is selected
    cb.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            CheckBox cb = (CheckBox) v;
            rowItems[position].setCB(cb.isChecked());

            if(cb.isChecked()) {
                for(int iCnt = 0; iCnt < arrCheckBoxes.size(); iCnt++) {
                    if (rowItems[iCnt].isCBChecked() && !rowItems[iCnt].getDeviceAddress().equals(rowItems[position].getDeviceAddress())) {
                        if (rowItems[iCnt].getDeviceMajorClass() == rowItems[position].getDeviceMajorClass()) {
                            arrCheckBoxes.get(iCnt).setChecked(false); // THIS IS WHERE ANOTHER CHECKBOX GETS UNCHECKED IF THE CONDITION GETS SATISFIED
                            rowItems[iCnt].setCB(false);
                            notifyDataSetChanged();
                        }
                    }
                }
            }
        }
    });

也感谢您的其他回答。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何处理Windows Installer中的复选框控件?

来自分类Dev

如何处理DataGrid中的复选框编辑事件

来自分类Dev

如何处理GridView中的复选框

来自分类Dev

如何处理复选框列表?

来自分类Dev

如何处理 ember 复选框绑定

来自分类Dev

如何处理数据表中的复选框单击事件

来自分类Dev

如何处理Angular 2 RC5中的复选框组?

来自分类Dev

如何处理 Liferay MVC Portlet 中复选框的动态列表

来自分类Dev

如何处理 ejs 中的一组复选框

来自分类Dev

如何处理 c# MVC 实体框架中的多个提交按钮和复选框?

来自分类Dev

如何处理ASP.NET WEb表单和代码隐藏文件中的多个复选框

来自分类Dev

如何在PHP中处理2个复选框?

来自分类Dev

在Laravel中处理复选框输入

来自分类Dev

处理联系表格中的复选框

来自分类Dev

处理硒中的复选框

来自分类Dev

如何隐藏html中的复选框?

来自分类Dev

如何在复选框中全选

来自分类Dev

如何验证表单中的复选框

来自分类Dev

如何从jcheckbox中删除复选框

来自分类Dev

如何从复选框中获取价值?

来自分类Dev

处理Laravel 4中Input :: all()中的复选框

来自分类Dev

处理Laravel 4中Input :: all()中的复选框

来自分类Dev

如何使用 HTML 或 PHP 或 JS 处理表单中的动态复选框输入

来自分类Dev

如何使用jQuery处理两个复选框

来自分类Dev

如何使用复选框处理Recyclerview状态?

来自分类Dev

如何从Listview.builder处理多个复选框?

来自分类Dev

如何使用react onchange动态处理复选框更改

来自分类Dev

如何制作复选框,Python,Django的表单处理程序

来自分类Dev

我如何让Tkinter处理复选框并调用某些功能?

Related 相关文章

热门标签

归档