user2523485
user2523485

Reputation:

GridView: getCheckedItemPositions() return no values or wrong values

I implemented a gallery with a Grid View that includes check boxes but i have problems with getCheckedItemPositions() method.

(1) If i launch the Activity with GridView, select some items and ask which items have been selected, the method getCheckedItemPositions() doesn't return any value.

(2) If i launch another Activity, i return to Activity with the GridView and ask what items have been selected, the method getCheckedItemPositions() returns wrong values .

I think first of all that the implementation of getView() is wrong, for (1) probably the GridView doesn't know which items are selected. I have no ideas for the (2) instead.

Here the code:

GalleryFragment getCheckedItemOnGridView():

private void getCheckedItemOnGridView() {
    if(D) Log.d(TAG, "getCheckedItemOnGridView(): called");
    SparseBooleanArray checkedItemPositions = mGalleryGridView.getCheckedItemPositions();
    for (int i=0 ; i<checkedItemPositions.size() ; i++) {
        if(D) Log.d(TAG, "checkedItemPositions : " + checkedItemPositions.valueAt(i) + " index " + checkedItemPositions.keyAt(i));
    }
}

Adapter extends BaseAdapter getView():

private SparseBooleanArray checked;

public View getView(final int position, View convertView, ViewGroup parent) {
        if(D) Log.d(TAG, "Called: getView");
    ViewHolder holder;

    if (convertView == null) {
        convertView = mLayoutInflater.inflate(R.layout.listitem_gallery, null);

        holder = new ViewHolder();
        holder.thumbnailView = (ImageView) convertView.findViewById(R.id.imageview_thumbnail);
        holder.checkBoxView = (CheckBox) convertView.findViewById(R.id.checkbox);

        holder.checkBoxView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (((CheckBox) view).isChecked()) {
                    checked.put((Integer) view.getTag(), true);

                } else {
                    checked.put((Integer) view.getTag(), false);
                }
            }
        });

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    BitmapFileImageLoader bitmapLoader = new BitmapFileImageLoader();
    bitmapLoader.loadBitmap(getItem(position), holder.thumbnailView);

    holder.checkBoxView.setTag(position);
    holder.checkBoxView.setChecked(checked.get(position));

    return convertView;
}

Upvotes: 1

Views: 1141

Answers (2)

user2523485
user2523485

Reputation:

Found new solution "workaround". The two solutions above didn't resolve the problem, so i decided to use directly the SparseBooleanArray used in the Adapter to solve the problem of check boxes with the view recycled. Here the code in Gallery Fragment:

private List<Resource> getCheckedItemOnGridView() {

    if(D) Log.d(TAG, "getCheckedItemOnGridView(): called");

    List<Resource> resources = new ArrayList<Resource>();
    // List of checked checkbox
    SparseBooleanArray checkedItemPositions = mAdapter.getCheckedItemPositions();

    for (int i=0 ; i<checkedItemPositions.size() ; i++) {
        if(checkedItemPositions.valueAt(i)) {
            if(D) Log.d(TAG, "getCheckedItemOnGridView(): item position checked: " + checkedItemPositions.keyAt(i));
            resources.add(mResources.get(checkedItemPositions.keyAt(i)));
        }
    }
    return (resources.isEmpty()) ? null : resources;
}

Upvotes: 1

Gopal Gopi
Gopal Gopi

Reputation: 11131

I don't think the problem is with OnClickListener of CheckBox. but you could try setting OnCheckedChangeListener instead of OnClickListener...

    holder.checkBoxView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int position = (Integer) buttonView.getTag();
            checked.put(position, isChecked); 
        }
    });

Upvotes: 1

Related Questions