繁体   English   中英

更新GridView子级

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM