GridView:getCheckedItemPositions()不返回任何值或错误的值

时间:2013-12-29 11:54:59

标签: android gridview checkbox

我实现了一个带有网格视图的图库,其中包含复选框,但我遇到了getCheckedItemPositions()方法的问题。

(1)如果我使用GridView启动Activity,选择一些项目并询问哪些项目已被选中,方法getCheckedItemPositions()不会返回任何值。

(2)如果我启动另一个Activity,我会使用GridView返回Activity并询问选择了哪些项目,方法getCheckedItemPositions()返回错误的值。

首先我认为getView()的实现是错误的,因为(1)GridView可能不知道选择了哪些项目。我对(2)没有任何想法。

这里是代码:

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));
    }
}

适配器扩展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;
}

2 个答案:

答案 0 :(得分:1)

我认为问题不在于OnClickListener的{​​{1}}。但您可以尝试设置CheckBox而不是OnCheckedChangeListener ...

OnClickListener

答案 1 :(得分:1)

找到新的解决方案&#34;解决方法&#34;。上面的两个解决方案都没有解决问题,所以我决定直接使用适配器中使用的SparseBooleanArray来解决回收视图的复选框问题。这里是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;
}