android - 更新 GridView 子项

标签 android android-widget

我在 Activity 中加载了一个 GridView,其中存在 fragment 。 GridView 本身并不位于 Fragment 中。我通过 BaseAdapter 创建了一个客户适配器,一切正常。

客户适配器.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 );
    }
}

问题是 subview 没有更新。标题更新为“选择了 1 个项目,选择了 2 个项目,等等)所以我知道正在调用该方法。设置背景确实会产生背景,所以这并不是说我只是看不到变化。 View 本身没有更新。我什至在创建 View 时在 View 上设置了随机 ID,并且执行 image.getId() 提供了正确的 ID,所以我知道它正在查找 View 。它只是没有更新它。有什么帮助吗?

最佳答案

这似乎不对:

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

原因:position设置为0<=position<=count-1。身份证是完全不同的东西。

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


编辑:

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

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

关于android - 更新 GridView 子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11852585/

相关文章:

android - 天气预报程序

android - Google Plus 应用程序(流)使用什么 View 组件?

android - 每秒定期更新小部件

java - 将 XML 数据(文件)绑定(bind)到 android 中的 GridView ?

android - Unresolved reference : GlideApp in activity written in Kotlin

android - doInBackground 方法中的异常

android - 在android中自动生成dimen.xml

Android:检查服务是否正在运行。绑定(bind)服务

java - Android,UnknownHostException : www. google.com,在设备上,而不是模拟器上

android - 为什么我们使用另一个继承binder类的类来访问BoundServices?