[英]Updating GridView child
我在一个Activity中加载了GridView,其中包含片段。 GridView本身不在Fragment中。 我通过BaseAdapter创建了一个客户适配器,并且一切正常。
CustomerAdapter.java
@Override
public View getView( int position, View convertView, ViewGroup parent ) {
ImageView v = new ImageView( activity );
Bitmap bmp = getBitmap( videoIds[ position ] );
v.setImageBitmap( bmp );
v.setAdjustViewBounds( true );
v.setPadding( 5, 5, 5, 5 );
v.setId( position );
thumbnails[ position ] = bmp;
return v;
}
我有一个上下文操作栏,可让您选择要上传,删除等的视频。
videoGallery.setChoiceMode( GridView.CHOICE_MODE_MULTIPLE_MODAL );
videoGallery.setMultiChoiceModeListener( new MultiChoiceModeListener() { ... }
选择视频后,我想在视频周围添加边框,因此,使用填充时只需添加背景色即可。 所以我在上面列出的新的MultiChoiceModeListener()部分中有此内容:
@Override
public void onItemCheckedStateChanged( ActionMode mode, int position, long id, boolean checked ) {
ImageView image = (ImageView)videoGallery.findViewById( position );
if( checked ) {
image.setBackgroundColor( Color.YELLOW );
} else {
image.setBackgroundColor( Color.TRANSPARENT );
}
int count = videoGallery.getCheckedItemCount();
if( count == 1 ) {
mode.setSubtitle( "1 item selected." );
} else if( count != 0 ) {
mode.setSubtitle( count + " items selected." );
} else {
mode.setSubtitle( null );
}
}
问题是子视图不会更新。 标题会更新(“已选择1个项目,已选择2个项目,等等。),所以我知道该方法正在被调用。设置背景确实会产生背景,因此并不是我无法看到更改。”本身并没有更新。我什至在视图创建时就在视图上设置了随机ID,image.getId()提供了正确的ID,所以我知道它正在查找视图,只是没有更新它。
这似乎不正确:
ImageView image = (ImageView)videoGallery.findViewById( position );
原因:位置被设置为0 <= position <= count-1。 id是完全不同的东西。
您需要更新原始数据本身,并告诉适配器更新其视图,例如使用notifyDataSetChanged()。
编辑:
这不是唯一的问题。 真正的问题是,您总是为getView()
创建一个新的ImageView(这是btw会导致内存泄漏,因为adapterView会缓存其创建的视图),而不是回收它。 您应该真正观看视频“ listView的世界 ”。
之所以对您不起作用,是因为您访问了不再使用的旧视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.