android - 从 fragment 中的 sqlite 动态设置复选框

标签 android sqlite listview checkbox android-fragments

我无法找出在 ListView 中存储和显示复选框的最佳方法。

现在我在 getView 方法中有代码:

@Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            //final ViewHolder holder;
            if (convertView == null) {
                convertView = getActivity().getLayoutInflater().inflate(R.layout.grid_item, null);
            }
            ImageView img = (ImageView) convertView.findViewById(R.id.grid_item_img);

            cb = (CheckBox) convertView.findViewById(R.id.chk_box_griditem);


            if(photos.get(position).getIshidden()){
                cb.setChecked(false);
            }else{
                cb.setChecked(true);
            }


            cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    MySQLiteHelper db = MySQLiteHelper.getInstance(getActivity());
                    Log.d("checkbox", "status: " + photos.get(position).getIshidden());

                    if (isChecked) {
                        photos.get(position).setIshidden(true);
                        cb.setChecked(true);
                        Log.d("checkbox", "isChecked");
                        db.updatePhoto(photos.get(position));

                    } else {
                        photos.get(position).setIshidden(false);
                        cb.setChecked(false);
                        Log.d("checkbox", "isCheckedelse");
                        db.updatePhoto(photos.get(position));
                    }

                }
            });

            imageLoader.displayImage(imgUrls[position], img, options, animateFirstListener);

            //img.setImageResource(mImgRes);
            return convertView;
        }

数据库助手将照片对象作为参数,并更新该行(如果存在)。所以现在我将当前照片对象 isHidden() 更新为 true 或 false,然后将更新后的对象传递给 db helper。

物理数据库似乎正在正确更新。但是,在设置复选框状态时会出现问题。复选框似乎是随机设置为选中或未选中的。

此外,我觉得在 getView 中执行此操作会占用 cpu,但不知道还能如何执行此操作。

最佳答案

首先删除cb.setOnCheckedChangeListener...您不需要每次调用getView时都设置OnCheckedChangeListener。您已经编写了以下代码来设置复选框状态(选中或未选中) )当 ListView 加载时。

if(photos.get(position).getIshidden())
cb.setChecked(false);
else
cb.setChecked(true);

现在在 ListView 上设置 onItemClick 监听器,如下所示:

    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) 
        {

            MySQLiteHelper db = MySQLiteHelper.getInstance(getActivity());
            Log.d("checkbox", "status: " + photos.get(position).getIshidden());

            if(photos.get(position).getIshidden())
            {
                ((CheckBox)arg0.getChildAt(position).findViewById(R.id.chk_box_griditem)).setChecked(true);
                photos.get(position).setIshidden(false);
                db.updatePhoto(photos.get(position));

            }   
            else
            {
                ((CheckBox)arg0.getChildAt(position).findViewById(R.id.chk_box_griditem)).setChecked(false);
                photos.get(position).setIshidden(true);
                db.updatePhoto(photos.get(position));

            }

        }


    });

通过这种方式,您可以选中或取消选中复选框,同时复选框状态(选中或未选中)将保存在您的数据库中。

我希望它能起作用。如果不行请告诉我..:)

关于android - 从 fragment 中的 sqlite 动态设置复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726275/

相关文章:

Ubuntu 14.04 LTS 中的 Android Studio 2.2 出现错误 : "Gradle sync failed: Cause: error=13, Permission denied"

java - 如何首先使用 Groovy Android Gradle 插件编译 groovy 代码

.net - sqlite3 的 System.DllNotFoundException

ios - 从两个应用程序访问共享数据

listview - 如何在 emacs lisp 中创建显示列表缓冲区

java - Android Listview 文本对齐

android - react native 安卓 : How to select the next TextInput after pressing the “actionNext” keyboard button?

.NET Framework 4.0 和使用 2.0 的程序集

java - 将 ListView 内的产品价格总和计算为字符串

android - 如何请求 GPS 许可并在完成后显示 map