【问题标题】:Updating GridView child更新 GridView 子项
【发布时间】:2012-08-07 19:16:04
【问题描述】:

我在 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,所以我知道它正在查找视图。它只是没有更新它。有什么帮助吗?

【问题讨论】:

  • 不是您问题的确切答案,但使用可绘制的状态列表可能更容易,如此处developer.android.com/guide/topics/resources/… 所述,系统将自动为您处理。
  • onItemCheckedStateChange() 被调用时,系统会不会智能到自动触发状态改变?因为我无法从代码中触发任何东西,这就是我的问题所在。
  • 是的,当item被选中时,会用状态列表drawable中“checked”状态对应的drawable重绘视图。您可能必须在 videoGallery 上调用 setItemChecked(position, true),但这不太可能。

标签: android android-widget


【解决方案1】:

这似乎不对:

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

原因:位置设置为 0

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


编辑:

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

它对您不起作用的原因是您访问了不再使用的旧视图。

【讨论】:

  • 我尝试将 id 更改为各种不同的东西。我能够在图像视图上执行.setId( 5000 + position ),并使用此方法打印出 GridView 中 ImageViews 的所有 ID,它们是 5000、50001 等。所以我能够访问视图,但任何我所做的更改未应用。
  • 完美。我知道它必须是那样的!谢谢。
  • 是的,无论如何,就像视频所说的那样,您应该尽量减少繁重操作的数量,包括膨胀/创建视图,甚至找到它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
相关资源
最近更新 更多