我实现了一个带有网格视图的图库,其中包含复选框,但我遇到了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;
}
答案 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;
}