2012-08-07 107 views
1

我具有与本片段的活性加载一个GridView。 GridView本身不在Fragment中。我通过BaseAdapter创建了一个客户适配器,并且一切都很好用。更新的GridView子

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,所以我知道它是找到的看法。这是不更新它。任何帮助吗?

+0

不是一个确切的回答你的问题,但它可能是更容易使用国家列表绘制,这里http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList的解释那么系统会自动为您处理。 – 2012-08-07 19:28:42

+0

当调用onItemCheckedStateChange()时,系统是否足够聪明以自动触发状态变化?因为我无法从代码中触发任何东西,这就是我的问题所在。 – 2012-08-07 19:38:05

+0

是的,当该项目被选中时,视图将被重新绘制,对应于可绘制状态列表中的“checked”状态的drawable。您可能需要在videoGallery上调用setItemChecked(position,true),但这不太可能。 – 2012-08-07 19:50:05

回答

1

这似乎并不正确:

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

的原因:位置被设置为0 < =位置< =计数1的ID是一个完全不同的事情

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


编辑:

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

,它不为你工作的原因是,您访问不再使用的旧观点。

+0

我试着将ID改为所有不同的东西。我能够在图像视图上执行'.setId(5000 +位置)',并使用此方法在GridView中打印出ImageView的所有ID,它们分别是5000,50001等。因此,我能够访问该视图,但我所做的任何更改都未应用。 – 2012-08-08 01:03:38

+0

看到我更新的答案。 – 2012-08-08 08:19:15

+0

完美。我知道它必须是这样的!谢谢。 – 2012-08-08 16:02:04