我一直在努力解决这个问题两天,并没有发现任何有用的在线。 我的设置是这样的,我有一个Gridview,我用API填充图像。现在GridView的每个单元格都包含一个按钮,点击时应该为该单元格添加一个叠加层。这是通过webservice根据值动态完成的。现在的问题是,当我向上或向下滚动添加到其他单元格的叠加层时,我该如何解决这个问题?通过适配器保存动态添加视图的状态
我已经试过什么:
我已经试过这是通过使用保存位置保存复选框的状态SparseBooleanArray解决方案,但因为我有保持挣扎这种方法不能解决问题视图的状态完好无损。
我怀疑什么:
的代码通过一个被称为按钮的点击方法增加覆盖。我使用点击位置通过gridView.getChildat(position)获取单元格,并将叠加层作为子元素添加到它。我认为我的convertView没有更新,这就是为什么覆盖层继续绘制不同的单元格位置。
相关代码:
这是我getView方法中,
if (convertView == null) {
convertView = inflater.inflate(R.layout.grid_image_row, null);
holder = new Holder();
holder.iv_product_image = (ImageView) convertView.findViewById(R.id.id_iv_product_image) ;
RelativeLayout.LayoutParams iv_product_image_params = new RelativeLayout.LayoutParams(imageWidth,imageHeight) ;
holder.iv_product_image.setLayoutParams(iv_product_image_params) ;
iv_product_image_params = null ;
holder.iv_loader_image = (ImageView) convertView.findViewById(R.id.id_iv_loader_image) ;
holder.bt_expand_save_overlay = (CheckBox) convertView.findViewById(R.id.id_bt_expand_save_overlay) ;
holder.tv_productname = (TextView) convertView.findViewById(R.id.id_tv_productname) ;
customFonts.SetSoureLightFont(holder.tv_productname) ;
holder.tv_sellingprice = (TextView) convertView.findViewById(R.id.id_tv_sellingprice) ;
customFonts.SetSoureLightFont(holder.tv_sellingprice) ;
holder.tv_price = (TextView) convertView.findViewById(R.id.id_tv_price) ;
customFonts.SetSoureRegularFont(holder.tv_price) ;
holder.parent_cell = null;
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}
编辑:这是我如何设置标签与位置...
if (session.isLoggedIn()) {
holder.bt_expand_save_overlay.setTag("1,"+position) ;
int i=0;
for (i=0; i<savedItemsHashMap.size(); i++) {
HashMap<String,String> savedItems = new HashMap<String, String>() ;
savedItems = savedItemsHashMap.get(i) ;
if (savedItems.get(GlobalVariables.KEY_PRODUCT_ID).equals(mapStr.get(GlobalVariables.KEY_ID))) {
holder.bt_expand_save_overlay.setButtonDrawable(R.drawable.wishlist_saved_drawable) ;
break ;
}
}
if (i==savedItemsHashMap.size()) {
holder.bt_expand_save_overlay.setButtonDrawable(R.drawable.wishlist_unsaved_drawable) ;
}
} else {
holder.bt_expand_save_overlay.setTag("0,"+position) ;
}
这是怎么了我绑定点击监听器里面的getView,我保存在标签中的位置。
holder.bt_expand_save_overlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String getTagString = (String)v.getTag() ;
String [] items = getTagString.split(",");
selectedExpandButton = Integer.valueOf(items[1]) ;
ExpandSaveForLaterOverlay (selectedExpandButton) ;
}
的ExpandSaveForLaterOverlay添加视图到选定单元格,但滚动的时候,这并不停留在同一个孩子。
在此先感谢您的帮助或提示!
更新:我检查了谷歌播放音乐应用程序,他们有相同的设置。他们有一个按钮的gridview,显示一个菜单覆盖点击。但是在滚动菜单之前,它不可见,只有在它滚动之后。有没有办法在视图实例本身保存覆盖?
你是否为所有项目添加了相同的叠加层? – keshav
ExpandSaveForLaterOverlay类根据项目的ID添加两种或三种布局。尽管如此,如果布局相同,那么同样的问题仍然存在。 –