【问题标题】:GridView: getCheckedItemPositions() return no values or wrong valuesGridView:getCheckedItemPositions() 不返回值或返回错误值
【发布时间】:2014-01-16 11:23:23
【问题描述】:

我用包含复选框的网格视图实现了一个画廊,但我在 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));
    }
}

Adapter 扩展 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;
}

【问题讨论】:

标签: android gridview checkbox


【解决方案1】:

找到新的解决方案“解决方法”。上面的两种方案都没有解决问题,所以我决定直接使用Adapter中使用的SparseBooleanArray来解决view回收的checkbox问题。这里是 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;
}

【讨论】:

    【解决方案2】:

    我认为问题不在于OnClickListenerCheckBox。但你可以尝试设置OnCheckedChangeListener 而不是OnClickListener...

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

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2019-02-03
      • 2011-12-04
      • 1970-01-01
      • 2019-10-13
      • 2020-10-05
      • 2015-11-19
      • 2020-05-27
      • 2017-04-16
      相关资源
      最近更新 更多