setChecked()方法在自定义适配器的getView()中不起作用

时间:2013-05-01 13:58:33

标签: android android-listview baseadapter

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

        public static class ImageAdapter extends BaseAdapter {
        private static Context mContext;
        private static LayoutInflater mInflater;
        // Keep all Images in array
        private static Bitmap[] mThumbIds;
        private static int mViewResourceId, pos;
        private static CheckBox cb;
        // Constructor
        public ImageAdapter(Context ctx, int viewResourceId, Bitmap[] pics) {
            mInflater = (LayoutInflater) ctx
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mThumbIds = pics;
            mViewResourceId = viewResourceId;
            mContext = ctx;
        }

        @Override
        public int getCount() {
            return mThumbIds.length;
        }

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

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

        @SuppressWarnings("deprecation")
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = mInflater.inflate(mViewResourceId, null);
            // ImageButton imageView = (ImageButton)
            // convertView.findViewById(R.id.icon);
            cb = new CheckBox(mContext);
            Drawable background = new BitmapDrawable(mThumbIds[position]);
            cb.setBackgroundDrawable(background);
            pos = position;
            System.out.println("Setting checkbox set: "+imageIsDup[pos]);
            cb.setChecked(imageIsDup[pos]);
            System.out.println("Has checkbox been set? "+cb.isChecked());
            cb.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    if (cb.isChecked()) {
                        imageIsDup[pos] = true;
                    } else
                        imageIsDup[pos] = false;
                }
            });
            return cb;
        }

    }
}

我正在设置适配器:

GridView list = (GridView) dialog
                            .findViewById(R.id.grid_view);
                    TextView no = (TextView) dialog
                            .findViewById(R.id.noOfDups);
                    no.setText("Found " + noOfImages
                            + " duplicates. Please verify.");
                    //list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
                    dialog.setTitle("Images Found");
                    dialog.setCancelable(true);
                    // ImageAndTextAdapter adapter = new ImageAndTextAdapter
                    // (longOperationContext, R.layout.row, imageNames,
                    // imageLocs, thumb);
                    ImageAdapter adapter = new ImageAdapter(
                            longOperationContext, R.layout.row, thumb);
                    System.out.println("No of images:"+thumb.length);
                    list.setAdapter(adapter);

如果我单击并取消选中它们,复选框就可以正常工作。什么行不通的是setChecked()函数。虽然参数为true,但在显示时没有设置复选框。这是什么错误?

此代码之前正在使用,我稍后进行了一些编辑,从那时起它就没有用了。我不记得编辑了。

更新的 即使只有8张图片,println消息也应该只有16,但48也是imageIsDup。第一组仅为假,后两组具有正确的{{1}}值。

3 个答案:

答案 0 :(得分:0)

您是否调用adapter.notifyDataSetChanged()方法来通知列表刷新视图?

此外,如果您使用的是eclipse,则可以从您编辑的任何文件中查看本地历史记录(可从右键单击菜单中获取) - 也许您可以使用它来记住您所做的编辑,这改变了您的功能。 / p>

答案 1 :(得分:0)

您可以使用 onitemClickListener ,而不是在ImageAdapter类中设置复选框侦听器,这最终将为您提供正在选择的位置。所以你可以从那里更新你的 imageIsDup数组

根据 imageIsDup的更新值

,CheckBox会自动保持选中或取消选中
list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
                    long arg3) {
                // TODO Auto-generated method stub
                                if(imageIsDup[pos] == true)
                                  imageIsDup[pos] = false;
                                else
                                  imageIsDup[pos] = true;
                              adapter.notifyDataSetChanged();

            }
        });

答案 2 :(得分:0)

我将getView更改为:

public View getView(int position, View convertView, ViewGroup parent) {
            convertView = mInflater.inflate(mViewResourceId, list, false);
            // ImageButton imageView = (ImageButton)
            // convertView.findViewById(R.id.icon);
            cb = (CheckBox) convertView.findViewById(R.id.select);
            //cb = new CheckBox(mContext);
            Drawable background = new BitmapDrawable(mThumbIds[position]);
            cb.setBackgroundDrawable(background);
            pos = position;
            System.out.println("Setting checkbox set: "+imageIsDup[pos]);
            cb.setChecked(imageIsDup[pos]);
            System.out.println("Has checkbox been set? "+cb.isChecked());
            cb.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    if (cb.isChecked()) {
                        imageIsDup[pos] = true;
                    } else
                        imageIsDup[pos] = false;
                }
            });
            return convertView;
        }