通过适配器保存动态添加视图的状态

时间:2013-12-16 12:44:45

标签: android

我一直在努力解决这个问题两天,但在网上找不到任何有用的东西。 我的设置是这样的,我有一个Gridview,我通过API填充图像。现在,GridView的每个单元格都包含一个按钮,单击该按钮时应该向单元格添加叠加层。这是通过webservice根据值动态完成的。现在的问题是当我向上或向下滚动添加的叠加层转移到其他单元格时。我如何解决这个问题?

我尝试了什么:

我尝试过SparseBooleanArray解决方案,用于通过保存位置来保存复选框的状态,但是这种方法无法解决问题,因为我正在努力保持视图的状态不变。

我怀疑:

代码通过单击按钮时调用的方法添加叠加层。我使用单击的位置通过gridView.getChildat(位置)获取单元格并将叠加层作为子项添加到它。我认为我的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,它在点击时显示菜单覆盖。但在滚动之前,菜单变得不可见,并且只有在滚动之后才滚动。是否无法在视图实例本身中保存叠加层?

2 个答案:

答案 0 :(得分:0)

尝试在适配器中的imageview上使用setTag(),如

holder.imageView.setTag(position);

当您将叠加层添加为像

这样的子项时,请使用getTag()
holder.imageView.getTag();

然后添加叠加。

答案 1 :(得分:0)

好吧最后我对android架构的看法是错误的。我需要的是将添加的布局显示为下拉列表。当滚动gridview时,应该滚动添加的布局。可用的android sdk不可能以任何方式。我可能必须为这些实现创建自己的视图,这将跟踪添加的叠加层的虚拟y和x位置。

相关问题