更新GridView子项

时间:2012-08-07 19:16:04

标签: android android-widget

我在活动中加载了一个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,所以我知道它正在查找视图。它只是没有更新它。任何帮助?< / p>

1 个答案:

答案 0 :(得分:1)

这似乎不对:

ImageView image = (ImageView)videoGallery.findViewById( position );

原因:位置设置为0&lt; = position&lt; = count-1。 id是完全不同的东西。

您需要更新原始数据本身,并告诉适配器更新其视图,例如使用notifyDataSetChanged()。


编辑:

这不是唯一的问题。真正的问题是你为getView()创建一个新的ImageView,总是(这个,顺便说一句,因为adapterView缓存它创建的视图导致内存泄漏),而不是回收它。你应该真的看视频“the world of listView”。

它不适合您的原因是您访问不再使用的旧视图。