2013-12-16 55 views
0

我一直在努力解决这个问题两天,并没有发现任何有用的在线。 我的设置是这样的,我有一个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,显示一个菜单覆盖点击。但是在滚动菜单之前,它不可见,只有在它滚动之后。有没有办法在视图实例本身保存覆盖?

+0

你是否为所有项目添加了相同的叠加层? – keshav

+0

ExpandSaveForLaterOverlay类根据项目的ID添加两种或三种布局。尽管如此,如果布局相同,那么同样的问题仍然存在。 –

回答

0

好吧,最后我对android架构的想法是错误的。我需要的是将添加的布局显示为下拉菜单。并且当gridview被滚动时,应该滚动添加的布局。这在任何可用的android sdk中都是不可能的。我可能不得不对这样的实现做出自己的看法,这些实现将跟踪添加的叠加层的虚拟y和x位置。

0

尝试在适配器上的ImageView使用setTag()之类

holder.imageView.setTag(position); 

而当你添加的覆盖作为一个孩子喜欢

holder.imageView.getTag(); 

再加入覆盖getTag()。

+0

嗨keshav感谢您的答案,但我相信我也这样做,如果你看看我的点击监听器,我与getView中的视图绑定,我只通过标签获取位置。当我滚动我的gridView时,问题就出现了,添加的覆盖图在不同的单元格上可见,而不是我最初添加的单元格。 –

+0

我不是在谈论convertta的settag(),而是为了在代码中添加覆盖图的imageview,而是为整个视图设置标记,这是不同的。 – keshav

+0

我以某种方式删除了代码,但现在可以再次检查问题,我已经更新了它。我将位置设置为标记到我在ExpandSaveForLaterOverlay函数中提取它的bt_expand_save_overlay。因此,我仅通过位置获取视图,然后将其作为孩子添加到视图中。这种方法只有在我滚动的时候才能正常工作。滚动gridview后,展开的覆盖图随机显示。 –

相关问题