从片段中的sqlite动态设置复选框

时间:2013-09-10 18:24:41

标签: android sqlite listview checkbox android-fragments

我无法找到在列表视图中存储和显示复选框的最佳方法。

现在我在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;
        }

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

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

另外我觉得在getView中执行此操作是贪婪的cpu但不确定如何执行此操作。

4 个答案:

答案 0 :(得分:3)

首先删除cb.setOnCheckedChangeListener ...每次调用getView时都不需要设置OnCheckedChangeListener。你已经编写了下面的代码来设置复选框状态(选中或取消选中) )当列表视图加载时。

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

现在在列表视图上设置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));

            }

        }


    });

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

我希望它会奏效。如果不让我知道.. :)

答案 1 :(得分:1)

初始化复选框时,如果图像被隐藏,请将检查状态设置为false。

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

但是在监听器中,您在选中复选框时将图像设置为隐藏。

if (isChecked) {
    photos.get(position).setIshidden(true);
...

这实际上是相反的。你可能对此感到不安。 而且您不必在侦听器中再次设置已检查状态。

因此,您在侦听器中的代码可能如下所示:

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

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

答案 2 :(得分:0)

1)不要在侦听器中设置复选框

2)仅当convertView为null(即充气时)时才将侦听器附加到复选框中。当您从convertview获取视图时,它已经设置了侦听器。

答案 3 :(得分:0)

更改然后记录。 OnCheckedChange你可以不使用if语句而只使用布尔值。您不需要在checkedchanged侦听器中的复选框中设置值。在onResume中初始化数据库,因此无法告知用户点击某些内容的次数,而数据库初始化会减慢速度。

cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                    photos.get(position).setIshidden(isChecked);
                    db.updatePhoto(photos.get(position));
                    Log.d("checkbox", isChecked.toString());
            }
        });



@Override
protected void onResume() {
    if (db==null) {
        db = MySQLiteHelper.getInstance(getActivity());
    }
}